Android开发中的内存管理一直是令人头痛的事情。其中占用内存最大的一般是Bitmap。
 
在上周五发布的MIUI开发版中,我添加了查看内存里Bitmap信息的功能。大家开发app的时候可以使用这个功能来查看分析app中的Bitmap情况。
 
使用方法:adb shell dumpsys gfxinfo [package name] [-b] [-e]
adb shell dumpsys gfxinfo是Android原有的功能。我在此之上添加了一些参数来输出Bitmap信息。
 
-b会输出进程中所有内存大于阈值(默认100k)的Bitmap信息,格式:
   [哈希值] [内存大小] [宽]x[高] [如果是preload则显示为preload] [图片资源/文件名称,可能是空]
 
例如,adb shell dumpsys gfxinfo com.android.systemui -b
All big bitmaps (debug.bitmap_threshold_size = 100 k):
    0x42da9af8  2,477k 1566x405 res/drawable-xxhdpi/overscroll_glow.png
    ...
Total count: 16, size: 25M
 
-e会将Bitmap保存在手机里。
例如,adb shell dumpsys gfxinfo com.android.systemui -e
  [其他的同上,但会多一行]:
Export bitmaps finished. Path: /data/data/com.android.systemui/cache/_exportbitmap/com.android.systemui
由于保存Bitmap比较耗时,可能会报错:Failure while dumping the app: ProcessRecord{4334ef80 1271:com.android.systemui/1000}
这没关系,在logcat里等到:D/DumpBitmapInfo( 1271): Export bitmaps finished. Path: /data/data/com.android.systemui/cache/_exportbitmap/com.android.systemui
这就表示完成了。然后可以通过
adb pull /data/data/com.android.systemui/cache/_exportbitmap/com.android.systemui 来取到电脑上查看。
 
高级参数 --nogc 指定不在dump之前调用一次GC(也就是说默认情况下会在dump之前触发一次GC)。
高级参数 --includepreload 指定包含preload的图片(也就是说默认情况下不会输出preload的图片)。
高级参数 --recycle:[Bitmap的hashcode] 通过这个可以recycle指定的Bitmap,来检验某个Bitmap是否会被使用。
 
可以通过更改prop: debug.bitmap_threshold_size 来更改阈值,默认100,单位K,只有大于等于它的才会显示出来。更改后要杀死进程重新启动app才会生效。
例如:adb shell setprop debug.bitmap_threshold_size 10
 
我们可以经常使用这个方法来查看内存中Bitmap的情况是否符合预期,当发现我们认为不应该存在的Bitmap,我们需要更改程序不让它加载或让它及早释放。
有时候我们不知道这个Bitmap是在哪里使用的,那么我们可以结合MAT(Eclipse Memory Analysis Tools)来找出其引用来源。
另外在OutOfMemoryError出现的时候或我们认为有内存泄露的时候,如果泄露的对象有Bitmap,那我们也可以用这个方法来分析。
 
步骤:
1. adb shell dumpsys gfxinfo [包名] -b 。找出泄露的图片,记下其hashcode。(目前在64位系统的手机上不能使用这个方法,其hashcode和MAT里的标识不对应)
2. DDMS里Dump HPROF file。打开MAT视图的Histogram > 找到Bitmap > List Object, with outgoing references > 通过上面的hashcode找到对应的Bitmap > Merge Shortest paths to GC Roots, exclude all .... 这样就找到了持有这个Bitmap的根。(小提示,在列表里找指定项的方法:在最下面那行"Total..."上按右键,选Expand All,键盘上输入要找的内容,如:“graphics.Bitmap”,然后按Esc键,这时就会选中Bitmap项。)
 
这是其介绍PPT,对后面那个步骤有详细图文讲解:https://www.slideshare.net/zhucai1234/miui-dump-bitmap-tool

MIUI添加内存调试工具:查看进程中的Bitmap信息的更多相关文章

  1. Android 设备,如何root,执行adb shell,查看设备中的数据库信息等【转】

    原文地址: Android 设备,如何root,执行adb shell,查看设备中的数据库信息等

  2. 查看进程中占cpu高的线程方法

    当在任务管理器中发现有进程占用cpu过高的时候通过下面的指令将进程快照导出到c盘 jstack -l 进程PID > c:/进程PID.stack  (此命令生成.stack文件在c盘中,用文本 ...

  3. Win下,通过Jstack截取Java进程中的堆栈信息

    在Java软件的使用过程中,有时会莫名的出现奇怪的问题.而这些问题常常无法使用日志信息定位,这时我们就需要通过查看进程内部线程的堆栈调用关系来分析问题出在哪里. 举个例子,当我们在做某个操作时,莫名的 ...

  4. 使用top查看进程和系统负载信息

    引言      使用top命令,可以查看正在运行的进程和系统负载信息,包括cpu负载.内存使用.各个进程所占系统资源等,top可以以一定频率更新这些统计信息.下面我们来学习top命令的具体使用方法. ...

  5. chmod a+w . 权限控制 su、sudo 修改文件所有者和文件所在组 添加用户到sudoer列表中 当前用户信息

    对当前目录对所有用户开放读写权限 chmod a+r . $ sudo chmod -R a+w /usr/lib/python2.7 所有用户添加文件的写权限 [linux]su.sudo.sudo ...

  6. 00014 - linux中用top、ps命令查看进程中的线程

    在Linux上显示某个进程的线程的几种方式. 方法一:PS 在ps命令中,“-T”选项可以开启线程查看.下面的命令列出了由进程号为<pid>的进程创建的所有线程. 1.$ ps -T -p ...

  7. 查看进程中的socket状态和数量

    程序运行时查看,结果是这样子的 C:\Users\Administrator>netstat -ano|findstr TCP TIME_WAIT TCP TIME_WAIT TCP TIME_ ...

  8. window2012如何查看进程中PID所对应的IIS应用程序池

    1.打开任务管理器,找到任意IIS进程,右击选择打开文件位置,获取到文件路径,例如:C:\Windows\System32\inetsrv 2.使用管理员打开cmd命令行工具,然后切换到刚才获取到文件 ...

  9. JAVA下查看进程中线程占用CPU较高的代码

    执行以下代码获得进程的线程.并找到CPU占用较高的线程ID ps -mp 16935 -o THREAD,tid,time   执行以下代码,通过线程ID获得16进制的线程标识 printf &quo ...

随机推荐

  1. Windows下 YOLOv3配置教程(YOLOv3项VS2013平台迁移的方法)

    https://blog.csdn.net/maweifei/article/details/81150489

  2. node基于express的socket.io

    前一段事件,我一个同学给他们公司用融云搭建了一套web及时通信系统,然后之前我的公司也用过环云来实现web及时通信,本人对web及时通信还是非常感兴趣的.私下读了融云和环信的开发文档,然后发现如果注册 ...

  3. You Arent Gonna Need It 理解

    软件开发是一项无法驾驭全局的工作,其工作效率,工作精神都高度依赖需求反馈. 开发不存在需求的功能,实际上是除了要开发软件,还要构思需求,这样一正一反,严重消耗了脑力资源. 如果是自己开发软件,需求来自 ...

  4. ALGO-2_蓝桥杯_算法训练_最大最小公倍数

    问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数,表示你找到的最小公倍数. 样例输入 样例输出 数据规模与约 ...

  5. 通过shell进行数学计算

    对于基本运算,可以使用let, $(())和$[] 对于高级运算,使用expr和bc这两个工具 [hupeng@hupeng-vm shell]$n1= [hupeng@hupeng-vm shell ...

  6. Linux性能分析 vmstat输出

    vmstat输出     1.linux系统下vmstat输出   vmstat的输出分为以下几种模式:   (1).VM MODE (普通选项) (2).DISK MODE(-d选项) (3).DI ...

  7. @echo 与 echo的区别

    @echo运行时 隐藏命令(不在terminal上显示) echo运行时显示命令(在terminal上显示) 同理@cp 与 cp  复制命令   不显示/显示

  8. div+Css绝对定位(absolute)和相对定位(relative)的总结

    1.没有外Div的情况下 设置绝对定位(absolute)和相对定位(relative)是没有区别的 2.相对定位占位置 而绝对定位不占位置 会漂浮在别的Div之上 3.若父Div没有设置定位,子Di ...

  9. Sqoop+mysql+Hive+ Ozzie数据仓库案例

    mysql 数据库脚本为: /*==============================================================*/ /* DBMS name: MySQL ...

  10. php 数组函数实例

    数组的概念 数组(array)是 PHP 中一个非常重要的概念,我们可以把数组看做一系列类似的数据的集合,实际上数组是一个有序图. PHP 还提供了超过 70 个内建函数来操作数组. 由于数组在php ...