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. View绘制基本知识点

    !通过阅读Android开发艺术探索整理   底层工作原理:测量流程.布局流程.绘制流程   常见回调方法:构造方法 onAttach onVisiblityChanged onDetach   Vi ...

  2. visual studio 2010 c++ fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或

    解决方案: 1,在项目 上 选择 “视图”- “属性页” 2,选择 “配置属性” - “清单工具” - “输入输出”,将 “嵌入清单”的值设置为 “否”

  3. tomcat和servlet的关系

    一.什么是servlet? 处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西.理解这个的前提是了解一些http协议的东西,并且知道 ...

  4. Java之优先队列

    PriorityQueue属于Java Collections Framework.PriorityQueue基于优先级堆,它是Queue接口的实现.当我们需要一个Queue实现时,可以使用这种数据结 ...

  5. bzoj 4930: 棋盘

    Description 给定一个n×n的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置(x,y),(u,v)能互相攻击当前仅 当满足以下两个条件: 1:x=u或y=v 2:对于(x,y)与 ...

  6. jmeter 参数化方法

    1.csv 看异步图书 JMeter实战60页

  7. 如何将JQUERY对象转成Javascript对象

    问: <div id="test"></div> $("#test") //由Javascript对象转为Jquery对象: 但是如何转 ...

  8. RouterOS 设定NAT loopback (Hairpin NAT)回流

    In the below network topology a web server behind a router is on private IP address space, and the r ...

  9. Web安全测试指南--会话管理

    会话复杂度: 5.3.2.会话预测: 5.3.3.会话定置: 5.3.4.CSRF: 5.3.5.会话注销: 5.3.6.会话超时:

  10. [UE4]为UStaticMeshComponent添加点击事件

    BlockMesh->OnClicked.AddDynamic(this, &APuzzleBlock::BlockClicked); //鼠标点击事件 BlockMesh->On ...