如何避免OOM总结
减小对象内存的占用
使用更加轻量的数据结构:
考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构.
ArrayMap:相比HashMap更节省内存,因为不需要额外的对象实例来记录Maping操作.
SparseArray:避免了对key与value的自动装箱(autoboxing),并且避免了装箱后的解箱.避免在Android里使用枚举
- 减小Bitmap对象的内存占用:
缩放比例:根据屏幕对图片进行等比例缩放.
格式解码:选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8, 存在很大差异. - 使用更小的图片
- 内存对象的重用利用:ObjectPool
- 复用系统自带的资源:
比如字符串、颜色、图片、动画、样式以及简单布局等.
- 复用系统自带的资源:
- 避免对象内存泄露
- 注意Activity的泄露:
内部类引用导致Activity内存泄露.
Context被传递到其他实例中. - 考虑使用Application Context而不是Activity Context
- 注意临时Bitmap对象的及时回收
- 注意监听器的注销
- 注意缓存容器中的对象泄漏
- 注意WebView的泄漏
- 注意Cursor对象是否及时关闭
- 注意Activity的泄露:
- 内存使用策略优化
- 综合考虑设备内存阈值与其他因素设计合适的缓存大小:
例如,在设计ListView或者GridView的Bitmap LRU缓存的时候,需要考虑的点有:
- 应用程序剩下了多少可用的内存空间?
- 有多少图片会被一次呈现到屏幕上?有多少图片需要事先缓存好以便快速滑动时能够立即显示到屏幕?
- 设备的屏幕大小与密度是多少? 一个xhdpi的设备会比hdpi需要一个更大的Cache来hold住同样数量的图片。
- 不同的页面针对Bitmap的设计的尺寸与配置是什么,大概会花费多少内存?
- 页面图片被访问的频率?是否存在其中的一部分比其他的图片具有更高的访问频繁?如果是,也许你想要保存那些最常访问的到内存中,或者为不同组别的位图(按访问频率分组)设置多个LruCache容器。
- onLowMemory()与onTrimMemory()
- 资源文件需要选择合适的文件夹进行存放
- 谨慎使用static对象
- 珍惜Services资源
- 谨慎使用“抽象”编程
- 综合考虑设备内存阈值与其他因素设计合适的缓存大小: