Tools, 出来接活了--Android内存优化第三弹

tools

引言

前两弹:
GC那些事儿
Android内存管理

欲善其事, 先利其器, 今天来聊聊那些内存分析工具.

1, 一图看懂Memory Monitor

Memory Monitor 是 Android Studio内置的, 官方的内存监测工具. 图形化的展示当前应用的内存状态, 包括已分配内存, 空闲内存, 内存实时动态等.

Memory Monitor
  • 顶部矩形指示当前调试的设备以及应用进程.

  • 图形区域:

    • 横向时间轴, 内存检测时间, 跟随滚动.
    • 纵向内存轴, 内存使用量, 根据应用使用动态分配.
    • 蓝色区域表示当前已分配使用的内存量.
    • 灰色区域表示剩余可使用的内存量.
    • 红色圈圈指示的是系统GC事件(内存有一定量的回收).
  • 工具栏:

    • ① GC按钮, 点击执行一次GC操作.
    • ② Dump Java Heap按钮, 点击会在该调试工程的captures目录生成一个类似这样"com.anly.githubapp_2016.09.21_23.42.hprof"命名的hprof文件, 并打开Android Studio的HPROF Viewer显示该文件内容.
    • ③ Allocation Traking按钮, 点击一次开始, 再次点击结束, 同样会在captrures目录生成一个文件, 类似"com.anly.githubapp_2016.09.21_23.48.alloc", alloc后缀的文件, 并打开Allocation Tracker视图展示该文件内容.

2, 使用HPROF Viewer & Analyzer来分析hprof文件

Memory Monitor通过Dump Java Heap可以生成一个hprof的文件, 这个文件是Android特定的Heap和CPU分析文件, 记录了这段时间内的Java Heap变化.

2.1 关于Java Heap

由Java Heap文件可以看到如下数据:

  • 按类型显示对象申请的内存快照(内存大小);
  • 每次自动或手动触发GC时的样本数据;
  • 协助定位可能发生的内存泄露点:
    • 所有已经被destroyed的activity, 还可以从GC Root访问到.
    • 重复的String实例.

2.2 HPROF Viewer怎么看

还是用图说话:

HPROF Viewer

HPROF Viewer分成三个大块, 分别介绍下:

2.2.1 Class View

图中标①的View.

显示当前选中的Heap中的所有Class. 上方有两个可选列表, 分别是用来选择Heap区域, 和Class View的展示方式的.

Heap类型分为:

  • App Heap -- 当前App使用的Heap
  • Image Heap -- 磁盘上当前App的内存映射拷贝
  • Zygote Heap -- Zygote进程Heap(每个App进程都是从Zygote孵化出来的, 这部分基本是framework中的通用的类的Heap)

可选展示方式:

  • Class List View -- 类列表方式
  • Package Tree View -- 根据包结构的树状显示
解释
Class Name 类名
Total Count 该类的实例个数
Heap Count 选定的Heap中该实例的个数
Sizeof 每个该实例占用的内存大小
Shallow Size 所有该类的实例占用的内存大小
Retained Size 该类的所有实例可支配的内存大小

2.2.2 Instance View

图中标②的View.
根据在Class View中选中的Class, 列表方式展示其所有实例的内存占用情况.

解释
Instance 该类的实例
Depth 深度, 从任一GC Root点到该实例的最短跳数
Dominating Size 该实例可支配的内存大小

2.2.3 Reference Tree

图中标③的View.
根据在Instance View中选中的实例, 显示其引用关系树.

此View中的列含义与Instance View一致.

在此View中可以右键点击instance, 进入代码:

Jump to Source

2.3 HPROF Analyzer

另外, 在HPROF Viewer的右侧有一个"Analyzer Tasks"的按钮, 点击会进入HPROF Analyzer的hprof的分析界面:

HPROF Analyzer

分析任务包括:

  • 检测泄露的Activity
  • 查找重复的String实例

点击开始按钮后, 会在Analysis Results区域显示分析结果.

HPROF Viewer & Analyzer 可以用来对App的运行中的Java Heap做一个整体分析, 展示当前内存的具体到类和实例的分配情况, 以便检测到可能的内存泄露和重复实例.

3, Allocation Tracker

HPROF Viewer & Analyzer是整体的, 那么Allocation Tracker则是针对操作的分析.

Allocation Tracker可以协助我们分析在一个特定操作时, 有哪些对象被分配内存了. 这可以很方便的让我们知道方法调用的情况, 以便针对性的优化, 以提升性能和内存使用.

在Android Studio的Memory Monitor中点击"Start Allocation Tracking", 在device中执行一个要分析的操作, 然后再次点击. 如下所示:

Start Allocation Tracking

会生成一个alloc文件, 并打开:

Allocation Tracker

可以按照两种方式展示:

  • Group by Method -- 按照线程方法分组显示
  • Group by Allocator -- 按照包分组显示

Method视图中的列含义如下:

解释
Method 方法
Count 该方法分配的实例总数
Size 该方法分配的内存总量(byte)

可以根据Count和Size分别排序, 找出产生实例多, 耗费内存多的方法, 结合代码分析, 以提升其性能.

4, MAT

Eclipse MAT是一个快速且功能丰富的Java Heap分析工具, 可以帮助我们寻找内存泄露, 减少内存消耗.

MAT可以分析程序(成千上万的对象产生过程中)生成的Heap dumps文件, 它会快速计算出对象的Retained Size, 来展示是哪些对象没有被GC, 自动生成内存泄露疑点的报告.

具体MAT的使用请移步鄙人翻译整理的MAT的使用手册

5, LeakCanary

LeakCanary是大名鼎鼎的square出的一款开源的用来做内存泄露检测的工具.

具体植入方式, 请参考LeakCanary README文档, 略过.

App植入LeakCanary之后, 在检测可能的内存泄露后, 会弹出Toast提示:

toast

并在测试手机桌面生成一个Leaks的icon:

leaks icon in launcher

点击该icon进入Leaks界面, 可以比较清晰的看到内存泄露疑点:

6, adb shell dumpsys

在之前的一篇关于ADB使用的文中有聊到adb shell dumpsys命令, 该命令可以用户输出当前的系统状态信息.

其中就有关于内存的选项:

$ adb shell dumpsys meminfo com.udinic.perfdemo

输出信息如下:

meminfo

该命令常用来查看当前进程的的内存使用状态, 是一个总体的预览.

结语

正所谓善其事先利其器, 了解了内存分析工具的使用, 我们才能更好的分析内存问题, 从而得出解决方案或是明白从哪些方面去避免内存问题.

下一篇将以代码实例形式来说明上面这些工具的具体使用, 敬请期待.


转载请注明出处, 欢迎大家分享到朋友圈, 微博~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容