前两弹:
GC那些事儿
Android内存管理java
欲善其事, 先利其器, 今天来聊聊那些内存分析工具.git
Memory Monitor 是 Android Studio内置的, 官方的内存监测工具. 图形化的展现当前应用的内存状态, 包括已分配内存, 空闲内存, 内存实时动态等.github
顶部矩形指示当前调试的设备以及应用进程.shell
图形区域:app
工具栏:eclipse
Memory Monitor经过Dump Java Heap能够生成一个hprof的文件, 这个文件是Android特定的Heap和CPU分析文件, 记录了这段时间内的Java Heap变化.工具
由Java Heap文件能够看到以下数据:post
仍是用图说话:
性能
HPROF Viewer分红三个大块, 分别介绍下:测试
图中标①的View.
显示当前选中的Heap中的全部Class. 上方有两个可选列表, 分别是用来选择Heap区域, 和Class View的展现方式的.
Heap类型分为:
可选展现方式:
列 | 解释 |
---|---|
Class Name | 类名 |
Total Count | 该类的实例个数 |
Heap Count | 选定的Heap中该实例的个数 |
Sizeof | 每一个该实例占用的内存大小 |
Shallow Size | 全部该类的实例占用的内存大小 |
Retained Size | 该类的全部实例可支配的内存大小 |
图中标②的View.
根据在Class View中选中的Class, 列表方式展现其全部实例的内存占用状况.
列 | 解释 |
---|---|
Instance | 该类的实例 |
Depth | 深度, 从任一GC Root点到该实例的最短跳数 |
Dominating Size | 该实例可支配的内存大小 |
图中标③的View.
根据在Instance View中选中的实例, 显示其引用关系树.
此View中的列含义与Instance View一致.
在此View中能够右键点击instance, 进入代码:
另外, 在HPROF Viewer的右侧有一个"Analyzer Tasks"的按钮, 点击会进入HPROF Analyzer的hprof的分析界面:
分析任务包括:
点击开始按钮后, 会在Analysis Results区域显示分析结果.
HPROF Viewer & Analyzer 能够用来对App的运行中的Java Heap作一个总体分析, 展现当前内存的具体到类和实例的分配状况, 以便检测到可能的内存泄露和重复实例.
HPROF Viewer & Analyzer是总体的, 那么Allocation Tracker则是针对操做的分析.
Allocation Tracker能够协助咱们分析在一个特定操做时, 有哪些对象被分配内存了. 这能够很方便的让咱们知道方法调用的状况, 以便针对性的优化, 以提高性能和内存使用.
在Android Studio的Memory Monitor中点击"Start Allocation Tracking", 在device中执行一个要分析的操做, 而后再次点击. 以下所示:
会生成一个alloc文件, 并打开:
能够按照两种方式展现:
Method视图中的列含义以下:
列 | 解释 |
---|---|
Method | 方法 |
Count | 该方法分配的实例总数 |
Size | 该方法分配的内存总量(byte) |
能够根据Count和Size分别排序, 找出产生实例多, 耗费内存多的方法, 结合代码分析, 以提高其性能.
Eclipse MAT是一个快速且功能丰富的Java Heap分析工具, 能够帮助咱们寻找内存泄露, 减小内存消耗.
MAT能够分析程序(成千上万的对象产生过程当中)生成的Heap dumps文件, 它会快速计算出对象的Retained Size, 来展现是哪些对象没有被GC, 自动生成内存泄露疑点的报告.
具体MAT的使用请移步鄙人翻译整理的MAT的使用手册
LeakCanary是大名鼎鼎的square出的一款开源的用来作内存泄露检测的工具.
具体植入方式, 请参考LeakCanary README文档, 略过.
App植入LeakCanary以后, 在检测可能的内存泄露后, 会弹出Toast提示:
并在测试手机桌面生成一个Leaks的icon:
点击该icon进入Leaks界面, 能够比较清晰的看到内存泄露疑点:
在以前的一篇关于ADB使用的文中有聊到adb shell dumpsys命令, 该命令能够用户输出当前的系统状态信息.
其中就有关于内存的选项:
$ adb shell dumpsys meminfo com.udinic.perfdemo复制代码
输出信息以下:
该命令经常使用来查看当前进程的的内存使用状态, 是一个整体的预览.
正所谓善其事先利其器, 了解了内存分析工具的使用, 咱们才能更好的分析内存问题, 从而得出解决方案或是明白从哪些方面去避免内存问题.
下一篇将以代码实例形式来讲明上面这些工具的具体使用, 敬请期待.
转载请注明出处, 欢迎你们分享到朋友圈, 微博~