目录
1.LeakCanary是什么?
2.LeakCanary有什么优点?
3.LeakCanary如何引入到项目中?
3.1引入leakcanary-android依赖
3.2确认LeakCanary是否运行
3.3LeakCanary自动检测以下对象的泄漏
4.LeakCanary如何分析内存泄漏?
4.1测试内存泄漏用例
4.2复杂的内存泄漏通过分析hprof文件
LeakCanary是一个为了Android使用的内存检测分析工具;
引入LeakCanary2.4的Android库,出现简单的内存泄漏可以方便通过打开Leaks内存泄漏文件,快速定位内存泄漏的位置,对于复杂得多内存泄漏问题可以通过查看LeakCanary库生成的hprof文件进行分析;
引入方便,可视化内存泄漏问题关联关系;
在app的module中的build.gradle文件中引入leakcanary-android依赖;
dependencies {
// debugImplementation because LeakCanary should only run in debug builds.
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4'
}
在LogCat控制台查看如下日志确认LeakCanary已经运行;
D LeakCanary: LeakCanary is running and ready to detect leaks
a.已销毁的Activity实例;
b.已销毁的Fragment实例;
c.已销毁的片段View实例;
d.已经清除的ViewModel实例;
匿名耗时内部线程类造成的内存泄漏-匿名线程内部类会持有外部Activity的实例引用导致Activity实例无法释放-垃圾回收
public class MemoryTestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_test);
anonymousInnerClass();
}
//匿名内部类持有MemoryTestActivity实例引用
public void anonymousInnerClass(){
new Thread(){
@Override
public void run() {
//执行异步处理
SystemClock.sleep(240000);
}
}.start();
}
}
测试方法打开关闭MemoryTestActivity页面;
我们打开测试app,打开关闭MemoryTestActivity页面,通知栏会出现如下内存泄漏通知,桌面会出现Leaks图标;
点击通知或者Leaks图标查看内存泄漏详细信息:
通过如上内存泄漏描述,很容易发现内存泄漏原因是由于MemoryTestActivity关闭时,由于Thread匿名内部线程持有MemoryTestActivity实例的引用而无法进行垃圾回收导致内存泄漏;
借助匿名耗时内部线程类造成的内存泄漏生成的hprof文件进行分析
菜单栏:View-Tool Windows-Device File Explorer,找到Download文件夹下的当前测试包下内存检测堆文件hprof文件:
可以看到一些内存检测文件hprof, 双击打开最新的hprof文件:
以上是打开hprof文件结果,点击Analyzer Task分析hprof文件;
解析hprof文件以后每个字段的含义,方面进行内存分析;
名称 | 描述 |
Class name | 类名 |
Total Count | 该类的实例总数 |
Heap Count | 所选择的堆中该类的实例的数量 |
Sizeof | 单个实例所占空间大小(如果每个实例所占空间大小不一样则显示0) |
Shallow Size | 堆里所有实例大小总和(Heap Count * Sizeof) |
Retained Size | 该类所有实例所支配的内存大小 |
Instance | 具体的实例 |
Reference Tree | 所选实例的引用,以及指向该引用的引用。 |
Depth | GC根节点到所选实例的最短路径的深度 |
Shallow Size | 所选实例的大小 |
Dominating Size | 所选实例所支配的内存大小 |
点击Analyzer Task分析hprof文件:
Leaked Activities : 有内存泄漏的activities
Duplicated Strings : 重复定义的字符串(一般可以不理会)
以上是LeakCanary2.4基本使用方法,是否很简单;
参考:
https://blog.csdn.net/baidu_31093133/article/details/81779711
https://square.github.io/leakcanary/fundamentals-how-leakcanary-works/