(二)OOM(Out Of Memory)

旧城等待, 2022-04-12 10:44 242阅读 0赞

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

1)查看内存使用情况

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

55fbd5bc5f9e9.jpg

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

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

55fbd610ee61d.jpg

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

55fbd613f417f.jpg

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

55fbd675c1faf.jpg

图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保持一致)。

55fbd6ac15338.jpg

图7

发表评论

表情:
评论列表 (有 0 条评论,242人围观)

还没有评论,来说两句吧...

相关阅读