安卓内存泄漏的检测
1.在adb 运行 adb shell dumpsys meminfo +包名 拿到程序内存,以及activity和view的数量,通过观察activity的数量检查有没有内存泄漏
2.集成 LeakCanary
在build.gradle里导入 implementation 'com.squareup.leakcanary:leakcanary-android:1.5.4'
在application里添加
if (LeakCanary.isInAnalyzerProcess(this)) { // This process is dedicated to LeakCanary for heap analysis. // You should not init your app in this process. return; } LeakCanary.install(this);
当出现内存泄漏时,会出现相应提示,以及堆栈
3.使用profiler
点击红色方框切换到memory,切换到内存,可以看到程序的内存情况
点击红色方框,可以拉取当前的内存快照,查看各个类,以及类的数量 如下图
如果还是没有分析出来,可以先点击下图红色框,再点击蓝色框 将内存文件下载下来
然后通过,ADK\platform-tools 中的hprof-conv.exe jiang下载下来的 .hprof文件转换成 MAT可以识别的 hprof文件,转换命令如下 hprof-conv -z 1.hprof 2.hprof 1.hprof 是原文件位置 2.hprof是转换后文件的位置。
然后下载MAT,下载下来解压,之后直接点击 MemoryAnalyzer.exe 运行就好了 。我在mat运行的时候报了 一个错,出现一个弹窗,弹窗第一句: Java was started but returned exit code=13 谷歌了一下,说可能是jdk版本跟下载的mat不兼容,就一个是32位的,一个是64位的,如何区分jdk版本 ![]
根据上面的方法证实了jdk跟MemoryAnalyzer版本冲突,然后我又重新下载了32位的,下载之后,打开成功运行,点击 file->open file 选中点击确定,如下图所示
点击红色框,出现下图所示的界面,他展示程序所有存活的对象,红色框是搜索框,
右键你所查看的类 选择 Merge shortest path to Gc Roots -> exclude all phantom/weak/soft 就可以看到所有的强引用了,关于 Shallow heap 和 Retained heap的含义 可以参考以下链接 https://www.jianshu.com/p/0deac3af0f45
相关链接 mat:https://blog.csdn.net/Jin_Kwok/article/details/80326088
ps:本人也是个菜鸟,如果有什么地方不对欢迎指正
本文地址:https://blog.csdn.net/qq_32545583/article/details/107882266