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. Server对象,HttpServerUtility类,获取服务器信息

    在Asp.net WebForm中,Server对象是HttpServerUtility类的实例.看下图: 而在Asp.net MVC中,Server对象是HttpServerUtilityBase对 ...

  2. Microsoft Dynamics CRM 4.0 如何添加自定义按钮

    一.通过导入导出ISV.Config(ISV配置),具体如下图: 先设置—>打开导出自定义项—>选择ISV配置—>选择导出所选自定义项 点击确定 保存到桌面,解压,用VS打开cust ...

  3. 大快DKhadoop开发环境安装常见问题与解决方案

    2018年度国内大数据公司排名50强本月初榜单发布,榜单上看到大快搜索跻身50强,再看看他们做的DKHadoop发行版,的确还是蛮厉害的吧!最起码这款DKHadoop用起来确实在易用性方面要更好!Dk ...

  4. 简单的爬虫例子——爬取豆瓣Top250的电影的排名、名字、评分、评论数

    爬取思路: url从网页上把代码搞下来bytes decode ---> utf-8 网页内容就是我的待匹配的字符串ret = re.findall(正则,待匹配的字符串), ret 是所有匹配 ...

  5. Django QuerySet和中介模型

    笔记如下 一.QuerySet QuerySet是什么? 类似列表里边存着对象 只和ORM有关系 from app01.models import Book def qDemo(request): b ...

  6. mac的framework的路径

    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/S ...

  7. electron热更新与windows下的安装包

    帮朋友公司做了点东西,他说有很多bug,我一看,基本问题都是浏览器兼容引起的,而electron内带Chromium内核,正好一直想尝试下electron,所以研究了一波.这里只是简单的使用elect ...

  8. R语言学习——欧拉计划(1)Multiples of 3 and 5

    [题目一]If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. ...

  9. Neutron 理解 (1): Neutron 所实现的网络虚拟化 [How Neutron Virtualizes Network]

    学习 Neutron 系列文章: (1)Neutron 所实现的网络虚拟化 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  10. [转]JSON.stringify 详解

    来自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify J ...