内存泄漏
Memory Leak 内存泄露的说明前面一篇有详细解释性能优化(二)内存管理 & Memory Leak & OOM
Memory Leak简单的说就是无用的对象占据着内存空间,没有合理释放,使得实际可使用内存变小,导致内存泄漏。
本文主要是展示分别用AS和MAT工具如何分析内存泄漏。
准备泄漏测试代码
核心Code
private void testMemoryLeak() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(60 * 60 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "VivianLeakThread").start();
}
Github Sample 地址
app启动,退出,如此循环3,4次。
Okay,环境准备好了,现在我们开始实战吧!
Android Studio分析
gc两次后,dump heap
按照报名排序,或者直接搜索MainActivity。看到红色部分,MainActivity被Thread持有导致很多个MainActivity没有被释放。
MAT分析
-
从AS导出hprof
-
hprof-conv工具转换成MAT可识别的格式
hprof-conv heap-original.hprof heap-converted.hprof
-
MAT打开文件(文件最好放在一个独立的文件夹里面,因为MAT分析的时候会产生很多的临时文件)
打开Histogram,搜索MainActivity
选择排除所有的幽灵,soft,weak reference
可以看到因为thead持有MainActivity的强引用,MainActivity无法释放,造成了内存泄露。