GC_EXTERNAL_ALLOCfreed與GC_EXPLICITfreed是什麼?

範大腳腳發表於2017-11-20

前面Free的記憶體是VM中java使用的記憶體,external是指VM中通過JNI中Native的類中的malloc分配出的記憶體,例如Bitmap和一些Cursor都是這麼分配的。
在Davilk中,給一個程式分配的記憶體根據機型廠商的不同,而不同,現在的大部分的是32M了,而在VM內部會把這些記憶體分成java使用的記憶體和 Native使用的記憶體,它們之間是不能共享的,就是說當你的Native記憶體用完了,現在Java又有空閒的記憶體,這時Native會重新像VM申請,而不是直接使用java的。
例如上邊的例子
free 3411K/6663K和external 24870K/26260K
如果這時需要建立一個2M的

Bitmap
,Native現有記憶體26260-24870=1390K<2048k,因此他就會向Vm申請記憶體,雖然java空閒的記憶體是
6663-3411=3252>2048,但這部分記憶體Native是不能使用。
但是你現在去申請2M的Native記憶體,VM會告訴你無法分配的,因為現在已使用的記憶體已經接近峰值了32M(26260+6663=32923 ),所以現在就會成force close 報OOM。
所以現在我們要檢查我們的native記憶體的使用情況來避免OOM。

本文轉自java豆子部落格園部落格,原文連結:http://www.cnblogs.com/error404/archive/2011/09/28/2194708.html,如需轉載請自行聯絡原作者


相關文章