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. Apache Shiro在web开发安全框架中的应用

    前阶段就hadoop的分享了一些内容,希望对新手入门的朋友有点帮助吧!对于hadoop新手入门的,还是比较推荐大快搜索的DKHadoop发行版,三节点标准版还是值得拥有的(三节点的标准版是可以免费下载 ...

  2. 【appium】根据xpath定位元素

    1. 背景 本文尝试使用的试验对象是SDK自带的NotePad应用实例,假设已经有两个Notes分别是“note1”和“note2”添加到Notepad上面,我们要做的就是尝试用xpath的方法来定位 ...

  3. ASP.NET实现Cookie功能的三个基本操作(写入,读取,删除)

      说正事 简而言之,在Cookie的时候有三个过程,分别是“写入,读取,删除”.任何伟大之作都是有基本的东西构成的,而Cookie的运用也不例外. 写入: 1 //创建一个HttpCookie对象 ...

  4. 【ActiveMQ入门-5】ActiveMQ学习-消息持久性

    ActiveMQ中的消息持久性     ActiveMQ很好的支持了消息的持久性(Persistence).消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是 ...

  5. centos7开机界面出现多个选项

    第一个选项正常启动,第二个选项急救模式启动(系统出项问题不能正常启动时使用并修复系统) 在CentOS更新后,并不会自动删除旧内核.所以在启动选项中会有多个内核选项,可以手动使用以下命令删除多余的内核 ...

  6. 第13章 TCP编程(1)_socket套接字

    1. socket套接字 (1)套接字简介 ①socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,它给应用进程提供了使用如TCP/UDP等网络协议进行网络通讯的手段. ②Linux中的 ...

  7. MySQL 创建数据库的两种方法

    使用 mysqladmin 创建数据库 使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mys ...

  8. Spark 编程模型(上)

    Spark的编程模型 核心概念(注意对比MR里的概念来学习) Spark Application的组成 Spark Application基本概念 Spark Application编程模型 回顾sc ...

  9. 小朋友学Python(1):Python简介与编程环境搭建

    一.Python简介 不死Java,不朽C/C++,新贵Python. Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰 ...

  10. AVL树Python实现

    # coding=utf-8 # AVL树Python实现 def get_height(node): return node.height if node else -1 def tree_mini ...