2011-05-04 99 views
12

如果我理解正確,一個android進程有兩個堆 - 一個由VM和一個本機管理。Android上本機堆的最大大小?

VM堆的大小不能超過16mb(至少在某些電話上該值可能更高)。

但是本地堆的最大大小呢?

16 MB的限制似乎不是一個硬性限制,因爲應用程序可以通過NDK分配超過16MB,但操作系統將開始殺死其他進程以及可能的前臺進程,以及大量內存被使用。

什麼時候操作系統啓動這樣的行爲?當本地堆+ VM堆大小超過16MB時?

Debug.getNativeHeapSize()給出了本機堆的大小,但是有沒有函數來檢查組合的native + VM堆大小?

好奇聽到誰知道這是如何工作的人!

回答

4

Android內存管理中沒有「死亡線」。當系統需要終止進程來回收內存時,它會考慮許多不同的因素,包括進程的重要性(由像是否處於前臺等因素決定,還是向前臺應用程序提供服務)以及它的內存使用。

如果你的進程是空閒的,並且坐在比其他任何東西都更多的內存上,它很可能首先被殺死。

隨着時間的推移,確切的算法已經發展了一點,系統沒有對特定行爲做出任何保證。

+0

好的,這是有道理的。一個猜測是,16MB + X的總內存使用率會導致進程冒着被殺死的風險,即使它在前臺。操作系統版本等X的大小可以不同 – Viktor 2011-05-06 12:22:04