OOM(Out Of Memory)

引用 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所示。


圖3 命令行查看內(nèi)存詳細(xì)占用情況

通過Android Studio的Memory Monitor查看內(nèi)存中Dalvik Heap的實(shí)時(shí)變化,如圖4、5、6所示。

圖4 Memory Monitor查看內(nèi)存中Dalvik Heap的實(shí)時(shí)變化(一)
圖5 Memory Monitor查看內(nèi)存中Dalvik Heap的實(shí)時(shí)變化(二)
圖6 Memory Monitor查看內(nèi)存中Dalvik Heap的實(shí)時(shí)變化(三)

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

圖7
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容