内存泄漏检测

工具MAT 和 LeakCanary Android 1.5
看懂LeakCanary分析结果

内存泄漏检测_第1张图片
这里写图片描述

先介绍下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:

  1. 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);

  1. 如 不可思议的OOM所述,OKhttpclient应该是单例,因为每一个OKhttpclient实例都会创建自己的连接池和线程池,非常浪费资源。

你可能感兴趣的:(内存泄漏检测)