当前位置: 移动技术网 > IT编程>脚本编程>Shell > 安卓内存泄漏的检测

安卓内存泄漏的检测

2020年08月10日  | 移动技术网IT编程  | 我要评论
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(th...

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版本 ![img]

根据上面的方法证实了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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网