一、Java内存分配策略
栈:基本数据类型,对象的引用(自动释放)
堆:对象,数组(GC)
静态存储区(方法区)
二、Java的引用
强引用:不能被GC回收,JVM宁可报出OOM错误也不会回收强引用对象
软引用:内存不足回收,适合创建缓存
弱引用:每次GC时回收,相比软引用,弱引用的对象拥有更短暂的生命周期
虚引用:随时都能被回收,必须和引用队列联合使用,跟踪对象被GC回收的活动
三、内存泄漏的根本原因
较长生命周期对象持有较短生命周期对象的引用,导致较短生命周期对象无法被GC回收
四、内存泄漏
单例(ApplicationContext)
非静态内部类默认持有外部类引用(Handle,Runnable,Asynctask)(1.静态内部类,2.弱引用)
资源未关闭(资源不会被回收导致内存泄漏)
webView(单独进程,应用占用内存过大时杀掉进程)
避免使用static变量(懒加载)
...
五、内存泄漏监测(LeakCanary)
原理:
1.手动触发GC,然后分析强引用的GC引用链
2.如果存在GC引用链,说明有内存泄漏,会在你的手机上弹出提示框
3.记录每一次内存泄漏的GC引用链,通过它可以直接定位到内存泄漏的未释放对象
源码:
1.Activity Destroy之后将它放在一个WeakReference中
2.这个WeakReference关联到一个ReferenceQueue
3.查看ReferenceQueue是否存在Activity的引用
4.如果该Activity泄露了,Dump出heap信息,然后在去分析泄漏路径