Android_内存泄漏排查以及修复

导出内存快照 .hprof文件

Android_内存泄漏排查以及修复_第1张图片
导出内存快照

AndroidStudio初步分析 .hpfrof文件

在AndroidStudio初步分析:
1.切换查看模式为 Package Tree View模式,找到对应的activiy进行分析;
效果如下图: 这里MainActivity 退出一次又进入,本来应该只存在一个的,但是如果存在内存泄漏,导致无法正常回收,存在两个实例 ;

Android_内存泄漏排查以及修复_第2张图片
hpfrof文件分析

2.可以使用AndroidStudio 自带的分析小工具来检测有可能泄漏的对象
如下图: 检测到LoginActivity有可能泄漏


Android_内存泄漏排查以及修复_第3张图片
image.png
Android_内存泄漏排查以及修复_第4张图片
image.png

使用MAT来进一步分析

MAT下载

经过上面步骤,发现有可疑的泄漏对象,使用MAT来进一步分析具体的泄漏原因

把AndroidStudio导入的内存快照转换一下为MAT的hprof模式
1.使用sdk/platform-tools/hprof-conv.exe 安卓SDK下面的hprof-conv命令来转换
adb 命令: hprof-conv -z 1.hprof 1_mat.hprof

image.png

2.或者直接使用AndroidStudio里面的工具直接导出hprof 文件,自动转换


Android_内存泄漏排查以及修复_第5张图片
image.png

3.使用MAT 打开转换后的 .hprof文件,然后搜索可疑的对象,然后选择
Merge Shortest Paths to GC Roots ,排除软,弱,虚引用

Android_内存泄漏排查以及修复_第6张图片
搜索
Android_内存泄漏排查以及修复_第7张图片
image.png
Android_内存泄漏排查以及修复_第8张图片
image.png

如上图,只显示强引用之后来分析泄漏的原因,查看被什么对象持有引用,导致不能正常回收;
这里就是MainActivity被系统的输入法InputMethodManager当中的mCurRootView持有,这个是系统的输入法内存泄漏,没有办法改变源代码,

解决: 使用反射来把mCurRootView设置为null

类似系统输入法,还有一些第三方SDK ,没办法改变源码,有的可以尝试使用反射来设置变量为null,来释放引用

你可能感兴趣的:(Android_内存泄漏排查以及修复)