排查手机APP内存泄漏
排查内存泄漏最简单和直观的方法
第1步:检测内存泄漏
先说一个terminal指令:
adb shelldumpsys meminfo (pid name)
这条指令是用来查询这个进程所占用的内存的具体详情的,通过这条指令可以看到当前app在手机中占用的具体的堆内存大小,view的数量,activity的数量,等等。如下图:
进程内存分配详情
(1) 其中activity数目是非常关键的一个信息,可以帮助我们快速地检测出内存泄漏。我们可以反复地进入退出需要测试的目标activity,如果在反复进入退出之后,用terminal执行上面的语句查询当前的内存情况,如果发现activity数量一直在增长,那么内存泄露一定是发生了!
Objects中的Activities表示当前内存中的activity对象的个数,启动一个activity就会生成一个activity对象,当退出activity的时候,activity对象就会被释放,所以反复的进出一个activity界面然后查看Activities的个数有没有保持不变,如果增加了,那么就说明这个activity对象没有被释放,也就是说可能存在内存泄漏,但是具体哪里泄漏了并不知道。
(2) Native/Dalvik 的 Heap 信息
具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
Native Heap是native层的内存堆栈,Dalvik Heap是java层的内存堆栈,如果这二者加起来的内存占用超过了应用最大内存限制就会报OOM异常,剩下的.so mmap是 C 库代码占用的内存,.jar mmap是Java 文件代码占用的内存 ,.apk mmap是apk代码占用的内存,.dex mmap是Dex 文件代码占用的内存
(3) Total 的 PSS 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
操作方法补充说明:
1. 先通过cmd打开命令窗口
2. 进入sdk目录所在盘符, 假设目录为D:\Program Files (x86)\Android\android-sdk\platform-tools, 输入命令D :
(sdk下载: http://www.android-studio.org/, 可以只下载sdk)
3. 输入命令进入sdk目录, cd D:\Program Files (x86)\Android\android-sdk\platform-tools
4. 输入命令 adb start-service
5. 输入命令 adb shell
6. 输入命令: dumpsys meminfo, 找到对应APP的进程id
7. 再输入命令: dumpsys meminfo (pid name)