最后
笔者已经把面试题和答案整理成了面试专题文档
解决:采用getApplicationContext
2.非静态内部类会默认持有外部类的引用
解决:使用静态内部类
3.Handle造成的内存泄露
解决:使用静态内部类+activity弱引用
4.new 一个线程造成的
使用静态内部类
5.webview造成的
通过killprocess杀掉进程解决
总结一下:大部分都是非静态内部类造成的
Java的4种对象引用:
强引用 StrongReference (宁愿抛出oom错误,让程序终止,GC(垃圾回收器)也不会回收)
软引用 SoftReference (内存足够,GC不会回收,内存不够的时候才回收)
弱引用 WeakRefrence (当垃圾回收器回收的时候,不区分内存够不够,都会回收)
虚引用 :没有任何引用,随时可以回收
1、leakcanary的原理
2、Activity的泄露监测机制
leakcanary的原理(利用弱引用来监控activity):
1、Activity Destroy之后将它放在一个WeakReference弱引用中
2、这个WeakReference关联到一个ReferenceQueue(引用队列)
3、查看ReferenceQueue队列是否存在activity的引用
4、如果Activity泄露了,Dump出heap信息,然后再去分析泄露路径
软引用和弱引用对象被GC回收了,Java虚拟机会把这个引用加入到与之关联的引用队列(ReferenceQueue)中。
源码流程:
1、创建RefWatcher,调用ActivityRefWatcher.install,启动一个ActivityRefWatcher,ActivityRefWatcher就是为了监视Activity的回收情况
2、通过ActivityLifecycleCallbacks对象把activity的onDestroy生命周期和ActivityRefWatcher类相关联。
3、最后在线程池中分析内存泄露
leakcanary如何在线程池中分析内存泄露?
在线程池中HeapAnalyzerService extends IntentService ,其实是一个Service的onHandleIntent中处理的,在这个Service中调用了一个checkForLeak方法,
checkForLeak是整个leakcanary中最重要的一个方法:
1、把.hprof转为Snapshot(内存快照)
2、优化gcroots
1200页Java架构面试专题及答案
小编整理不易,对这份1200页Java架构面试专题及答案感兴趣劳烦帮忙转发/点赞
百度、字节、美团等大厂常见面试题
目源码】](https://bbs.csdn.net/topics/618154847)收录**