Android性能优化--内存泄漏

一、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信息,然后在去分析泄漏路径

posted @ 2018-03-07 10:03  我为恬恬上青铜  阅读(144)  评论(0编辑  收藏  举报