内存分析工具之LeakCanary2.4使用整理

目录

 

1.LeakCanary是什么?

2.LeakCanary有什么优点?

3.LeakCanary如何引入到项目中?

3.1引入leakcanary-android依赖

3.2确认LeakCanary是否运行

3.3LeakCanary自动检测以下对象的泄漏

4.LeakCanary如何分析内存泄漏?

4.1测试内存泄漏用例

4.2复杂的内存泄漏通过分析hprof文件


1.LeakCanary是什么?

LeakCanary是一个为了Android使用的内存检测分析工具;

2.LeakCanary有什么优点?

引入LeakCanary2.4的Android库,出现简单的内存泄漏可以方便通过打开Leaks内存泄漏文件,快速定位内存泄漏的位置,对于复杂得多内存泄漏问题可以通过查看LeakCanary库生成的hprof文件进行分析;

引入方便,可视化内存泄漏问题关联关系;

3.LeakCanary如何引入到项目中?

3.1引入leakcanary-android依赖

在app的module中的build.gradle文件中引入leakcanary-android依赖;

dependencies {
  // debugImplementation because LeakCanary should only run in debug builds.
  debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4'
}

3.2确认LeakCanary是否运行

在LogCat控制台查看如下日志确认LeakCanary已经运行;

D LeakCanary: LeakCanary is running and ready to detect leaks

内存分析工具之LeakCanary2.4使用整理_第1张图片

3.3LeakCanary自动检测以下对象的泄漏

a.已销毁的Activity实例;

b.已销毁的Fragment实例;

c.已销毁的片段View实例;

d.已经清除的ViewModel实例;

4.LeakCanary如何分析内存泄漏?

4.1测试内存泄漏用例

匿名耗时内部线程类造成的内存泄漏-匿名线程内部类会持有外部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图标;

内存分析工具之LeakCanary2.4使用整理_第2张图片

内存分析工具之LeakCanary2.4使用整理_第3张图片

点击通知或者Leaks图标查看内存泄漏详细信息:

内存分析工具之LeakCanary2.4使用整理_第4张图片

通过如上内存泄漏描述,很容易发现内存泄漏原因是由于MemoryTestActivity关闭时,由于Thread匿名内部线程持有MemoryTestActivity实例的引用而无法进行垃圾回收导致内存泄漏;

4.2复杂的内存泄漏通过分析hprof文件

借助匿名耗时内部线程类造成的内存泄漏生成的hprof文件进行分析

菜单栏:View-Tool Windows-Device File Explorer,找到Download文件夹下的当前测试包下内存检测堆文件hprof文件:

内存分析工具之LeakCanary2.4使用整理_第5张图片

可以看到一些内存检测文件hprof, 双击打开最新的hprof文件:

内存分析工具之LeakCanary2.4使用整理_第6张图片

以上是打开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文件:

内存分析工具之LeakCanary2.4使用整理_第7张图片

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/

你可能感兴趣的:(Android拓展,LeakCanary,内存泄漏)