引用 https://www.csdn.net/article/2015-09-18/2825737/1
該篇文件僅僅做了排版,方便閱讀
前面我們提到過使用getMemoryClass()的方法可以得到Dalvik Heap的閾值。簡要地獲取某個(gè)應(yīng)用的內(nèi)存占用情況可以參考下面的示例(更多內(nèi)存查看的知識(shí),可以參考Google官方教程: Investigating Your RAM Usage)
1)查看內(nèi)存使用情況
通過命令行查看內(nèi)存詳細(xì)占用情況,如圖3所示。
通過Android Studio的Memory Monitor查看內(nèi)存中Dalvik Heap的實(shí)時(shí)變化,如圖4、5、6所示。
2)發(fā)生OOM的條件
關(guān)于Native Heap、Dalvik Heap、PSS等內(nèi)存管理機(jī)制比較復(fù)雜,這里就不展開詳細(xì)描述。簡單的說,通過不同的內(nèi)存分配方式(malloc/mmap/JNIEnv/etc)對(duì)不同的對(duì)象(Bitmap/etc)進(jìn)行操作,會(huì)因?yàn)锳ndroid系統(tǒng)版本的差異而產(chǎn)生不同的行為,對(duì)Native Heap與Dalvik Heap以及OOM的判斷條件都會(huì)有所影響。在2.x的系統(tǒng)上,我們常??梢钥吹紿eap Size的total值,明顯超過了通過getMemoryClass()獲取到的閾值而不會(huì)發(fā)生OOM的情況。那么,針對(duì)2.x與4.x的Android系統(tǒng),到底如何判斷會(huì)發(fā)生OOM呢?
Android 2.x系統(tǒng)GC LOG中的dalvik allocated + external allocated + 新分配的大小 >= getMemoryClass()值的時(shí)候就會(huì)發(fā)生OOM。 例如,假設(shè)有這么一段Dalvik輸出的GC LOG:GC_FOR_MALLOC free 2K, 13% free 32586K/37455K, external 8989K/10356K, paused 20ms,那么32586+8989+(新分配23975)=65550>64M時(shí),就會(huì)發(fā)生OOM。
Android 4.x的系統(tǒng)廢除了external的計(jì)數(shù)器,類似Bitmap的分配改到Dalvik的Java Heap中申請(qǐng)。只要allocated + 新分配的內(nèi)存 >= getMemoryClass()的時(shí)候就會(huì)發(fā)生OOM,如圖7所示(注:雖然圖示演示的是ART運(yùn)行環(huán)境,但是統(tǒng)計(jì)規(guī)則還是和Dalvik保持一致)。