一、内存泄漏的原因
Activity 的泄漏、Cursor 未关闭、线程的过度使用、无节制的创建缓存、以及某个 so 库悄无声息一点点的泄漏内存
二、检测内存泄漏
1)Java内存泄漏
1、LeakCanary Activity 泄露检测 --(原理:弱引用监测,activity onDestory是否被释放)
2、Bitmap分配及回收追踪 -- (原理:所有被创建出来得Bitmap加入weakHashMap)
3、代码扫描 -- (打开文件没有关闭,注册事件没有释放)
4、线程数量监控 -- (定时器 10 分钟 dump 出应用所有的线程,500+容易oom)
5、重复图片监控 -- 重复图片指的是 Bitmap 的像素数据完全一致,但是有多个不同的对象存在
2) Native内存泄漏
1、针对无法重编 so 的情况,使用了 PLT Hook 拦截库的内存分配函数,定期扫描分配与释放是否配对
2、针对可重编的 so 情况,通过 GCC 的“-finstrument-functions”参数给所有函数插桩,桩中模拟调用栈入栈出栈操作,通过 ld 的“–wrap”参数拦截内存分配和释放函数,定期扫描分配与释放是否配对
三、监控内存使用
1、美团 probe -- 裁剪hprof上传到服务端分析,或者客户端本地分析
四、避免占用过多的内存
1、webp、9n图片的使用
2、选用合理的数据格式 使用SparseArray(折半查找)、SparseBooleanArray, and LongSparseArray来代替Hashmap
3、统一的bitmap加载器,图片裁剪,清除图片缓存
来源:
https://mp.weixin.qq.com/s/KtGfi5th-4YHOZsEmTOsjg?
https://mp.weixin.qq.com/s/Z7oMv0IgKWNkhLon_hFakg?
美团:https://tech.meituan.com/2019/11/14/crash-oom-probe-practice.html