常规操作顺序:
- dumpsys meminfo;初步判断内存泄漏信息。但是这个只能处理一般的app内存泄漏。
- 对于系统级别的匿名内存泄漏不太准确,此时需要cat /proc/meminfo 查看系统整体内存情况下;
- 在1、2中确认系统内存出现问题了,进一步使用adb shell am dumpheap分析内存,这个工具的使用可以参考:https://blog.csdn.net/cigogo/article/details/90548079(文本分析)和https://blog.csdn.net/yellowcath/article/details/78085419(ddms的可视化UI分析工具)
- 内存泄漏一般就是找到高频重复出现的地址偏移和动态库信息
- addr2line(gcc编译)、llvm-symbolizer工具(clang编译)找到地址偏移量对应的代码
#########################################################
https://www.jianshu.com/p/a644769fe5b6
后来我查到可以用debug malloc工具调查底层的内存申请和释放(参考https://www.jianshu.com/p/2b43abdd6647 和 https://blog.csdn.net/ritterliu/article/details/52217347)
更新连接:https://blog.csdn.net/yellowcath/article/details/78085419
关于内存查看工具的使用总结:
1. cat /proc/meminfo 查看系统整体的内存信息
2. showmap [pid] 查看当前进程整体的内存使用情况
3. procmem [pid] 查看进程的内存使用情况;不建议使用这个命令,因为信息太多没有合并;showmap这个命令将相同模块的内存使用合并显示
4. procrank 查看当前系统中的大部分进程内存使用情况
5 dumpsys meminfo 这个命令展示部分进程的PSS信息,最后统计RAM使用量,Total RAM>=Free RAM+ Used RAM:
Free RAM这个值很小,Used RAM和Lost RAM异常大时,初步定位内存异常。Lost RAM这个的值比较特别,单独不可以作为内存泄漏的判断。需要配合/proc/meminfo的MemFree同时观察。
6. /proc/[pid]/目录下的几个关于内存的子文件:
maps文件:显示的信息和procmem是一样的,procmem做了简单的整理
smaps:和maps比较是一个更加详细的内存信息文件,一般maps的信息就可以判断了,这个文件信息太多还没有研究
statm和stat这2个文件目前还没有发现很大的作用需要进一步研究
status:这是一个很重要的文件,关于其总的一些值介绍:
VmPeak:表示历史内存的最高使用量
VmSize:当前内存使用量
上面2个值可以判断程序内存使用是否收敛,如果VmPeak一直增加,VmSize这个值不能及时的减少而是和VmPeak保持一直那么内存泄漏了
VmHWM: 45244 kB
VmRSS: 31164 kB
VmData: 27328 kB
VmStk: 136 kB
VmExe: 8 kB
VmLib: 24408 kB 动态库的内存使用
以上是判断系统发生内存泄漏了。接下就要定位内存泄漏。
一般android中大部分程序都可能运行在java虚拟机上,因此当java的vm heap可以直接使用ddms诊断定位;但是如果是native的内存泄漏了就需要在android系统中开启malloc调试模式,参考上面红色部分启动ddms的native模块查看native的信息。目前在高版本的android上studio直接支持比较方便,但是低版本的android需要按照上https://www.jianshu.com/p/2b43abdd6647 这个链接介绍的很详细。但是目前sdk中找不到ddms了 要调试早期的android找工具吧!早期的sdk/tools/ddms这个程序直执行就可以看到需要的东西了。给一个工具链接https://pan.baidu.com/s/1dvtvwJ99XZRm263-w4jMGA