• MIUI添加内存调试工具:查看进程中的Bitmap信息


    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
  • 相关阅读:
    postman+newman+jenkins 接口自动化问题
    rabbitMQ Management http://localhost:15672/ 打不开
    转-轻松几步搭建SVN服务器
    Eclipse调优
    转- 关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)
    calculate Leave Days
    验证只能输入中文
    js 只能限制只能输入数字和转大写方法
    拿来自勉
    JAVA的容器---List,Map,Set的区别
  • 原文地址:https://www.cnblogs.com/zhucai/p/miui_add_dump_bitmap_tools.html
Copyright © 2020-2023  润新知