工具MAT 和 LeakCanary Android 1.5
看懂LeakCanary分析结果
先介绍下Java编译的知识
java文件编译生成class文件其基本规则是这样的:
内部类的class文件命名是:主类+$+内部类名
匿名类的class文件命名是:主类+$+(1,2,3....)
匿名类自动生成对父类的引用,引用的变量名是this$0
所以Splash$1就是Splash类的第一个匿名类。而this$0是Splash类
上图的意思就是MessageQueue的成员变量mMessages是Message类; mMessages.callback是Splash的一个匿名内部类(常见的匿名类比如Handler,Runnable,Callback),如前述,callback包含了Splash的引用this$0,Splash由此泄漏。
LeakCanary 检测结果分析
泄漏源
分析和处理
ViewConfiguration.mcontext泄漏Activity
在new一个View时候不要用Activity作为入参,传入Application的context,除非能保证此View的生命周期和此Activity一样
其他防止内存泄漏tip:
- Android xml中的src加载本地drawable资源也是使用BitMap,但没有像图片加载框架一样很好的优化BitMap的重用和回收。所以在列表中的item的ImageView如果要加载网络图片,就不写src,而是在加载图片方法的入参中设置默认图,例如
private BitmapManager.LoadConfig podcasterImageLoadConfig = new BitmapManager.LoadConfig(R.drawable.icon_default_head, DuoTinLocalConstant.IMG_SIZE_SMALL, 0);
- 如 不可思议的OOM所述,OKhttpclient应该是单例,因为每一个OKhttpclient实例都会创建自己的连接池和线程池,非常浪费资源。
网友评论