内存分析工具LeakCanary是如何工作的

一旦LeakCanary被安装,它自动检测和报告内存泄漏,分4步:

  1. 检测保留下来的对象;
  2. 导出堆信息;
  3. 分析堆信息;
  4. 对内存泄漏进行分类;

目录

 

1.检测保留下来的对象

2.导出堆文件

3.分析堆文件

4.对内存泄漏进行分类

5.其他


1.检测保留下来的对象

LeakCanary通过Hook(劫持)Android生命周期去自动检测内存泄漏问题,当Activity和Fragment被销毁并且执行垃圾回收的时候;这些被销毁的对象被传递给ObjectWatcher(持有这些销毁的对象的弱引用);LeakCanary自动检测如下对象的内存泄漏:

a.已销毁的Activity实例;

b.已销毁的Fragment实例;

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

d.已经清除的ViewModel实例;

可以检测任何不在需要的对象,例如一个被移除的View或者一个销毁的Presenter:

AppWatcher.INSTANCE.getObjectWatcher().watch(textView2, "View was detached");

如果持有弱引用销毁对象的ObjectWatcher在等候5秒并且运行垃圾回收不能被清除,被观察的销毁对象可能被保留,存在潜在的内存泄漏问题;

LeakCanary输入日志在Logcat控制台下:

D LeakCanary: Watching instance of com.example.leakcanary.MainActivity
  (Activity received Activity#onDestroy() callback) 

... 5 seconds later ...

D LeakCanary: Scheduling check for retained objects because found new object
  retained

LeakCanary一直等候被保留未销毁的对象数量达到阀值(5)再导出heap堆hprof文件,并在通知栏显示最新未销毁对象的数量;

notification

通知提示有4个未销毁的对象被保留,点击通知可以导出heap堆文件;

D LeakCanary: Rescheduling check for retained objects in 2000ms because found
  only 4 retained objects (< 5 while app visible)

注意:

默认阈值为应用程序可见时5个保留对象,应用程序不可见时1个保留对象。如果您看到retained objects通知,然后将应用程序置于后台(例如按Home按钮),那么阈值将从5更改为1,LeakCanary将在5秒内导出堆文件。点击通知会强制LeakCanary立即导出堆文件。

2.导出堆文件

当未销毁对象被保留达到阀值,LeakCanary导出Java的堆信息存储到hprof文件;导出heap堆文件会短暂冻结APP,在导出堆文件时会有如下通知:

toast

默认存储堆文件在app文件夹下的leakcanary目录下,如果设置android.permission.WRITE_EXTERNAL_STORAGE权限并授权此权限,则堆文件存储在SD卡的Download/leakcanary-com.example目录下,com.example是app的包名;

3.分析堆文件

Shark: Smart Heap Analysis Reports for Kotlin;

Shark是为LeakCanary 2提供功能强大的堆分析器。它是一个Kotlin独立堆分析库,以低内存占用率高速运行。

Shark被支持如下功能:

a.Shark Hprof:读取和写入Hprof文件中的记录。

b.Shark Graph:导航堆对象图。

c.Shark:生成堆分析报告。

d.Shark Android:Android启发式生成定制的堆分析报告。

e.Shark CLI:分析安装在连接到桌面的Android设备上的可调试应用程序堆。输出与LeakCanary的输出类似,只是您不必将LeakCanary依赖项添加到应用程序中。

LeakCanary:建在上面。它会自动监视被销毁的Activity和Fragment,触发堆存储,运行Shark Android,然后显示结果。

06-27 15:19:38.515 9186-9224/fan.fragmentdemo D/LeakCanary: Removing 1 heap dumps
06-27 15:19:41.523 9186-9494/fan.fragmentdemo D/LeakCanary: Analysis in progress, working on: PARSING_HEAP_DUMP
06-27 15:19:43.267 9186-9494/fan.fragmentdemo D/LeakCanary: Analysis in progress, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值