(二)OOM(Out Of Memory)
前面我们提到过使用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
还没有评论,来说两句吧...