github地址:https://github.com/square/leakcanary
简介及使用教程:https://square.github.io/leakcanary/
使用
在app中的build.gradle中添加:
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.2'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2'
// 可选,如果你使用了support支持库中的fragment,则需要添加这个依赖
debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.2'
}
然后在Application中配置:
public class MyApplication extends Application {
@Override
public void onCreate() {
if(LeakCanary.isInAnalyzerProcess(this)) {
return;
}
LeakCanary.install(this);
}
}
内存泄漏检测原理
怎么判断一个对象已死呢?可达性分析算法,即从GC Roots出发,如果无法寻到一条路径指向该对象,则对象已死,可以被回收。
假设是我们自己来设计 LeakCanary ,我们会怎么设计呢?显然是不可能去监听所有对象的,这样不现实,肯定是去找特定对象来监控,在Android中,常见的内存泄漏都会导致Activity无法被回收,Activity就是最特定的对象,所以,可以监听Activity ,此外还有Fragment。
LeakCanary 正是这样设计的,它目前可以监听 Activity 和 Fragment。
Java与C/C++的区别:
C/C++由程序员写new和delete相关代码来手动分配和释放内存,而Java有内存自动管理机制,由JVM的GC来自动进行垃圾回收,当本该回收的对象由于被其他对象持有引用而无法被GC回收时就会产生内存泄漏。
源码分析
参考:
Android开发教程】面试必问:LeakCanary如何解决内存泄露以及原理解析
看完这篇 LeakCanary 原理分析,又可以虐面试官了
LeakCanary原理解析
LeakCanary 原理分析
LeakCanary原理分析