简单记录:使用八种策略进行OOM等问题的内存优化,crash从6.72%降低到0.5%

100 阅读2分钟

1. 背景

新项目中存在一个业务(相册:图片网格列表+日期分组收缩/展开)。

在上线后发生了大量的OOM,友盟崩溃率达到6.72%。

(测试过6万张图片、上万个视频的场景。)

Dingtalk_20240510193938.jpg

机型主要是低版本手机(5.0~6.0.1)

问题定位:内存抖动、内存溢出;

所以赶紧开始bugfix。

2. 前后数据说明:

友盟crash:6.72% -> 0.5%

内存峰值:400多MB -> 200多MB

3. 内存优化:

具体采用每个方案后的内存变化,之前没有进行详细的记录。SDK有升级,也做了其它优化,还原回去要改很多东西,所以就不列举出来了。

3.1 图像解码格式

效果:降低一半,内存峰值从400多MB降低到200多MB

Glide.with(...)
    .load(...)
    .format(DecodeFormat.PREFER_RGB_565)
    .into(...)

3.2 使用缩略图

因为是3列的网格列表,图片不用太清晰。

Glide.with(...)
    .load(...)
    .format(...)
    .thumbnail(0.01f)
    .into(...)

3.3 详情页不进行内存缓存

详情页,用户用完即走,因此在进行打开时,不需要进行内存缓存

Glide的skipMemoryCache(true)

3.4 详情页不进行磁盘缓存

原因同3.4

diskCacheStrategy(DiskCacheStrategy.NONE)

3.5 牺牲内存提高加载速度

android:largeHeap="true"

这个并不能降低内存使用。

但是可以给应用获得更多的内存分配,防止内存溢出。

转存失败,建议直接上传图片文件

3.6 限制内存分配大小,但会变慢

android:hardwareAccelerated="false"

虽然内存从230多降低到180多,但业务用时会增加很多,因此没有采用。

后面对业务用时进行了优化,不过已经没有oom问题了,就没有补上。

速度快点更好。

3.7 及时回收Bitmap

// 修改前
BitmapFactory.decodeFile(file.toString(), options)


// 修改后
BitmapFactory.decodeFile(file.toString(), options)?.recycle()

3.8 减少资源文件访问

存在一个逻辑(如3.7),需要获取图片文件的一些信息。

修改了这个逻辑,将这个操作放到详情页打开的时候去获取。

或者尽量不调用。

4. 结语

本来想写很多的。

不过之前没怎么记录文档,现在代码回退也要改很多。

所以简单记录分享下。