欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

安卓内存泄漏的检测

程序员文章站 2022-03-21 22:20:31
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版本 ![安卓内存泄漏的检测]

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

相关标签: Java 安卓