如何避免OOM产生考点
- 对Java内存管理机制有一定认知
- Android内存优化经验
- 代码编写习惯避免内存消耗
如何避免OOM产生(原因)
- OOM如何产生?
- 如何优化程序减少内存占用
如何产生OOM?
- 已使用内存+新申请内存>可分配内存
- OOM几乎覆盖了所有内存,通常指堆内存
- Native Heap在物理内存不够时会抛出OOM
如何解决OOM?
- 使用合适的数据结构类型{
以HashMap为例展开优化
原数个数(>1000 -> HashMap else ArrayMap or SparseArray)
增删频繁吗(频繁->HashMap else ArrayMap or SparseArray)
Key是整形吗(是-> SparseArray else ArrayMap)
HashMap vs ArrayMap{- 查询 (HashMap ->n(1) ArrayMap ->n(logn))
- 插入 (HashMap ->n(1) ArrayMap ->n(logn))
- 扩容 (HashMap ->X2 ArrayMap ->X1.5)
- 缩容 (HashMap ->无 ArrayMap ->X0.5)
- 额外对象(HashMap -> 额外的Entry ArrayMap->没有)
- 复用 (HashMap -> 无 ArrayMap->小数组复用池)
为什么整形使用SparseArray? : 避免了整形的装箱拆箱的开销
枚举的问题{
一个枚举可以占用内存1-1.4kb 而使用int则可以减轻内存占用,使用枚举不光会有占用内存的问题,还会导致编译出来的.dex体积变大
}
}
Bitmap如何优化占用内存
选择合适的分辨率
注意原始文件分辨率与内存缩放的结果
不用帧动画,尽量用代码写
考虑对Bitmap的重采样和复用配置
谨慎使用大堆
android:LargeHeap:true
使用大堆后不同手机会分配不同的内存,但是会导致GC的时候会比较慢
}