LeakCanary
原理
public static void main(String[] args) {
ReferenceQueue<Object> q = new ReferenceQueue<>();
Object test = new Object();
WeakReference<Object> weakReference = new WeakReference<>(test,q);
//print false
System.out.println("是否在队列中?"+(q.poll()==weakReference));
test=null;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Runtime.getRuntime().gc();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// print true
System.out.println("是否在队列中?"+(q.poll()==weakReference));
}
Activity
通过 Application 注册 ActivityLifeCycleCallback,当Activity onDestroy 时,开始监测Activity。
具体方式是创建指向Activity的 WeakReference,并指定一个 ReferenceQueue。当Activity被回收时,WeakReference 会被添加到引用队列中。通过强制执行垃圾回收,确保Activity在未泄漏的情况下能被正常回收。然后去ReferenceQueue 中去找Activity对应的 WeakReference,如果没有,说明发生了泄漏。
Fragment
通过 FragmentManager#registerFragmentLifecycleCallbacks,注册Fragment生命周期callback,然后在 Fragment destroy或者viewDestroy时,检查Fragment或者 Fragment的view是否泄漏。
相关链接
最后更新于
这有帮助吗?