OOM-关于Android内存溢出的一些解决思路的整理

原因:系统为每一个应用程序分配了不同的内存上限,如果超过这个上限被视为内存泄露,从而被kill掉。

比如:

1.加载对象过大
2.相应资源过多,来不及加载。


解决办法们

oom这个真的不好权衡,下面这些注意事项好多是相互矛盾的,根据业务,各取所需吧。
而且一味的追求小内存开销,也不好。
毕竟,硬件本身的性能越来越强大,你不用,它也会老化。

一、图片

1.内存中加载图片直接在内存中做处理(如边界压缩)
2.减少Bitmap对象的内存占用

1.加载之前先计算出合适的缩放比例
2.选择合适的解码格式:ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,内存在很大差异。

3.临时Bitmap的及时回收

二、对象

1.动态回收内存
2.内存引用上做一些处理。(eg:软引用)
3.对象的复用

1.复用系统自带的资源:字符串、图片、动画、样式、颜色、简单布局
2.列表(eg:ListView)中对视图的复用
3.实例对象的复用:inBitmap属性可以告知Bitmap解码器使用已经存在的内存区域而不是重新申请一块内存区域
4.避免对象的频繁创建(eg:在onDraw()、循环中创建对象等)
5.StringBuilder替代""+""的拼接
6.用Integer.toString代替String.valueOf(int)和 int+"";(因为String会做很多业务上不必要的判断。(其实这应该算是性能问题了哈:)

4.当心对象的复用

比如static对象:因为这玩意和应用进程一样长命

5.注意单例模式中的不合理持有

虽然单例模式有效的避免了对象的多出创建,但缺点也在这里:单例的生命周期和应用保持一致(static),使用不合理很容易出现持有对象的泄漏。

6.注意监听器的及时注销
7.避免使用枚举Enum(好多时候用枚举就图个好看)
8.使用更加轻量的数据结构

考虑使用ArrayMap/SpareseArray而不是传统的HashMap等数据结构。因为HashMap需要一个额外的实例对象来记录Mapping的操作。

9.如果没有必要,就不要用抽象类

因为抽象类这些一般都没有正经的事做。


三、页面上

1.优化布局层次,减少内存开销
2.Activity方面的问题

1.Activity对静态变量的持有问题
2.页面回收时记得清空Handler消息队列
3.Activity Context被其他实例持有

3.webview的泄露

Android不同版本对webview产生有很大差异。
常用的办法:为webview新开一个进程,通过AIDL与主进程通信。(在需要的时候对webView进行销毁


四、系统

1.自定义堆内存大小
2.优化Delivk虚拟机的堆内存分配
3.申请大内存large heap

谨慎使用!这可能会影响整个系统的用户体验。

4.Services用完及时停止。

因为这货的优先级一般较高,系统一般不会吧Service所占用的RAM空间腾出来让给其他组件

5.谨慎使用多进程

多进程可以把应用中的部分组件运行在单独的进程当中,系统一般会给多进程分配更多的内存,
但是这会显著增加代码的逻辑复杂度,而且容易成为业界的毒瘤。

6.注意第三方libraries的应用

一般你是不会用到一个libraries的所有功能的,这就存在用内存去养那些你压根就不会用的对象

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,143评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 13,088评论 2 59
  • HereAndroid的内存优化是性能优化中很重要的一部分,而避免OOM又是内存优化中比较核心的一点。这是一篇关于...
    HarryXR阅读 3,862评论 1 24
  • 季节里情动的心, 飘落成一片枯叶的模样, 在寂寞的风中摇曳, 风雨过后 我还是一如既往, 所欠下的情债 用一辈子清...
    古城苍狼阅读 434评论 4 12
  • 邪淫是影响我们命运的最恶毒的。就像我讲的,上影响九祖不得超生,九祖啊!多可怕!下影响七玄不得护佑啊! 我们最简单的...
    秦东魁阅读 1,422评论 0 0