内存泄漏检测

工具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:

  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实例都会创建自己的连接池和线程池,非常浪费资源。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。