1. 程式人生 > >Android官網記憶體管理概略--翻譯

Android官網記憶體管理概略--翻譯

重點概括:

  1. Android是採用paging和mmapping管理的記憶體
  2. 程式碼檔案(.odex)、資原始檔(zipalign後的resource)採用mmapping 將檔案以page為單位 對映到記憶體。在必要的時候(如切換APP、記憶體不足)可以page out到硬碟上
  3. 多個程序可以用mmapping 對映一塊記憶體(如ContentProvider、WindowSurface,該memory不在應用程序空間,而在核心管理的page cache中)進行讀寫,達到IPC(程序間通訊)的功能。所以計算Android heap佔用的記憶體 要考慮到共享記憶體。 PSS(Proportional set size)= unshared memory + (共享memory / 共享該memory的程序數);USS(Unique set size)= unshared memory:RSS(resident set size)= unshared memory + shared memory;VSS:所有可讀取地址空間(包括不在RAM的memory,如mallocs分配後沒有寫的)(RSS和VSS通常價值不大,因為不能精確反應共享記憶體)

ART和Dalvik虛擬機器使用  頁式排程(paging)和memory-mapping(mmapping)去管理記憶體。這意味著一個app的 any memory改變後(通過分配new objects 或 touching mmapped pages)都將停留在RAM中 並且 無法被paged out(換頁到硬盤裡)。唯一釋放記憶體的方法是 釋放被app持有的object引用,使memory可以被GC。有一個例外:任何mmapped的沒有更改的檔案,例如 程式碼,可以被RAM paged out,如果系統需要記憶體處理別的作業。

本文側重於解釋Android如果管理app程序和記憶體分配。

Garbage collection:

目標:

  1. 找到將來無法被程式讀取的 objects 資料
  2. 回收被objects使用的資料

其他的都老生常態就是省略了。。。。。

Sharing Memory(共享記憶體)

  1. 每個app程序都從Zygote fork出來,zygote 系統啟動時開啟,載入框架code和resource(activity theme)。使FrameWork在RAM pages中大部分的code和resource 可以被所有的app程序共享
  2. 大部分static data採用 mmapped 到程序內,mmapping允許程序間共享資料,允許必要時 paged out 出RAM。static data有:Dalvik code(放置在 預連線的.ode檔案將直接mmapping),app resources(需要機構化resource table使其可以被 mmapped,需要對齊apk中的zip實體,也就是要zipalign app),和傳統的專案元素(如.so檔案中的native code)。
  3. 在很多地方,Android通過顯式的分配共享記憶體區域(ashmem或gralloc) 來跨程序共享 相同的動態RAM。例如:window surfaces在app和screen compositor之間共享記憶體,cursor buffer在content provider和client之間共享記憶體。

因大量使用share memory,在確定app使用多少memory時要留心。測量RAM的方法

Allocating and Reclaiming App Memory(分配回收App記憶體)

app程序的Dalvik heap被限制在 single virtual memory range(單獨一塊的虛擬記憶體範圍內),heap size可以增加,但是系統定義了上限。

heap使用的虛擬記憶體 不等於 使用的實體記憶體大小。當監測 APP的heap時,Android統計一個數值被稱為Proportional Set Size(PSS),PSS包含與其他程序共享的 dirty and clean pages,但共享記憶體只統計 一個app所佔RAM比例的大小(如:3個app共享15個pages,則PSS中共享記憶體為5個pages)。系統認為PSS是實體記憶體的footprint(印記,也就是消耗了,像碳排放印記)。

Dalvik不壓縮logical heap size,也就是Android不會對heap進行碎片整理以關閉空間。Android只可以縮小logical heap size,當heap的末尾有不使用的空間。

然而系統仍舊可以減少 heap使用的physical memory size。在GC後,Dalvik將未使用的pages返回給核心(使用系統呼叫madvise)。

Restricting App Memory(限制App記憶體)

  1. 限制由手機RAM總量決定,到達上限將會 OOM。
  2. 查詢app heap可用大小: ActivityManager,getMemoryClass() (返回單位為M,一般是16,大的裝置可能是24 或 更高)

Switching apps

1.app被切換掉,程序會快取到LRU cache中

2.記憶體不夠時,以LRU 和 佔用記憶體大小 為依據來殺程序