GC_EXTERNAL_ALLOC

09-28 17:16:37.543: DEBUG/dalvikvm(21466): GC_EXTERNAL_ALLOC freed 390 objects / 45656 bytes in 50ms
09-28 17:16:40.513: DEBUG/dalvikvm(3267): GC_EXPLICIT freed 4501 objects / 251624 bytes in 67ms

很多做開發的朋友不明白上面這句是什麼意思,給大家解釋一下! 

前面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。

發佈了26 篇原創文章 · 獲贊 9 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章