OOM(Out Of Memory)

引用 https://www.csdn.net/article/2015-09-18/2825737/1
该篇文件仅仅做了排版,方便阅读


前面我们提到过使用getMemoryClass()的方法可以得到Dalvik Heap的阈值。简要地获取某个应用的内存占用情况可以参考下面的示例(更多内存查看的知识,可以参考Google官方教程: Investigating Your RAM Usage

1)查看内存使用情况

通过命令行查看内存详细占用情况,如图3所示。


图3 命令行查看内存详细占用情况

通过Android Studio的Memory Monitor查看内存中Dalvik Heap的实时变化,如图4、5、6所示。

图4 Memory Monitor查看内存中Dalvik Heap的实时变化(一)
图5 Memory Monitor查看内存中Dalvik Heap的实时变化(二)
图6 Memory Monitor查看内存中Dalvik Heap的实时变化(三)

2)发生OOM的条件

关于Native Heap、Dalvik Heap、PSS等内存管理机制比较复杂,这里就不展开详细描述。简单的说,通过不同的内存分配方式(malloc/mmap/JNIEnv/etc)对不同的对象(Bitmap/etc)进行操作,会因为Android系统版本的差异而产生不同的行为,对Native Heap与Dalvik Heap以及OOM的判断条件都会有所影响。在2.x的系统上,我们常常可以看到Heap Size的total值,明显超过了通过getMemoryClass()获取到的阈值而不会发生OOM的情况。那么,针对2.x与4.x的Android系统,到底如何判断会发生OOM呢?

  • Android 2.x系统GC LOG中的dalvik allocated + external allocated + 新分配的大小 >= getMemoryClass()值的时候就会发生OOM。 例如,假设有这么一段Dalvik输出的GC LOG:GC_FOR_MALLOC free 2K, 13% free 32586K/37455K, external 8989K/10356K, paused 20ms,那么32586+8989+(新分配23975)=65550>64M时,就会发生OOM。

  • Android 4.x的系统废除了external的计数器,类似Bitmap的分配改到Dalvik的Java Heap中申请。只要allocated + 新分配的内存 >= getMemoryClass()的时候就会发生OOM,如图7所示(注:虽然图示演示的是ART运行环境,但是统计规则还是和Dalvik保持一致)。

图7
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容