Android中的記憶體使用量狀況統計
紅狼部落格
based on android 2.3.5
1. Android中的記憶體使用量狀況統計
在Android的“正在運行服務”中有關於“已用空間”和“可用空間”的統計,但它不是通常意義(傳統Linux)上的記憶體使用量情況統計,而是基於Low Memory Killer和Android虛擬機器的Activity堆棧上的可用記憶體統計。因為在傳統程式中,程式退出後記憶體即釋放;但是在Android中,即使按back鍵返回後,為了使用緩衝提高效能,Acitivity執行個體還有可能儲存在堆棧上。基於這種設計理念,它的統計資料也不同於傳統意義上的統計資料(如Linux下的free命令和/proc/meminfo)。
在”設定-應用程式-正在啟動並執行服務”中,可以看到如下(HTC chacha 810e):
圖中最下面一行列出了已用空間和可用空間。那麼這兩個數值是怎麼得到的呢?查看該圖對應的代碼packages/apps/Settings/src/com/android/settings/applications/RunningProcessesView.java
字串“已用空間”通過字串id號service_foreground_processes得到,“可用空間”通過字串id號service_background_processes得到。
因此,可知“已用空間”的值為:
String sizeStr = Formatter.formatShortFileSize(getContext(),
mLastForegroundProcessMemory + mLastServiceProcessMemory);
也就是說,已用空間的表示前台進程和後台服務佔用的空間。
可用空間的字串值為:
String sizeStr = Formatter.formatShortFileSize(getContext(),
mLastAvailMemory + mLastBackgroundProcessMemory);
它表示可用的記憶體加上背景程式佔用的空間。那麼程式和Service佔用的空間具體指什麼呢?
在RunningState.java中,統計了前景程式和背景程式以及Service所佔用的空間(由三種PSS相加)。PSS 是Proportional Set Size的縮寫,表示 實際使用的實體記憶體,因為進程之間經常共用.so庫,所以PSS是按比例分配共用庫後佔用的實體記憶體。這三種PSS在framework/base/core/java/android/os/Debug.java中的MemoryInfo中:
/** The proportional set size for dalvik. */
public int dalvikPss;
/** The proportional set size for the native heap. */
public int nativePss;
/** The proportional set size for everything else. */
public int otherPss;
再來看一下上面的mLastAvailMemory(即availMem):
long availMem = readAvailMem() – SECONDARY_SERVER_MEM;
在readAvailMem中,根據/proc/meminfo檔案中的MemFree和Cached兩項的值計算出Avail的值,還要減去SECONDARY_SERVER_MEM(屬性ro.SECONDARY_SERVER_MEM通常在build/target/board/generic_x86/init.rc中設定為4096,因此該塊記憶體為4096*PAGE_SIZE=16MB)
因此,“可用空間”表示閑置的記憶體(free+cached)+後台進程佔用的空間-預留的空間(SECONDARY_SERVER_MEM,通常為16MB)。因為Low Memory Killer的作用,在記憶體較少時,可以釋放背景程式的進程空間,所以包含了背景程式的空間。
另附1:
VSS – Virtual Set Size 虛擬耗用記憶體(包含共用庫佔用的記憶體)
RSS – Resident Set Size 實際使用實體記憶體(包含共用庫佔用的記憶體)
PSS – Proportional Set Size 實際使用的實體記憶體(比例分配共用庫佔用的記憶體)
USS – Unique Set Size 進程獨自佔用的實體記憶體(不包含共用庫佔用的記憶體)
可以使用procrank查看Android系統的各進程的VSS/RSS/PSS/USS的值。
另附2:LinearColorBar是個LinaerLayout。按mLastForegroundProcessMemory/ mLastServiceProcessMemory/mLastBackgroundProcessMemory三者佔用比確定RGB顏色,見代碼LinearColorBar.java中的setRatios。
2. Linux系統的傳統記憶體使用量情況統計
free命令和/proc/meminfo
Linux下的free命令用於查看系統記憶體使用量情況,我的PC機上的Ubunt10.04的free命令執行結果如下:
上面的 totoal(1018216KB)是總記憶體數量,used(992664KB)表示已經使用的數量, free(25552KB)表示空閑數量。其中,total(1018216KB)=used(992664KB)+free(25552KB)。後面的buffers(9700)表示往磁碟空間裡“寫”的緩衝區大小,cached表示“讀”的資料的緩衝,它們屬於used的一部分。二者可以快速變為可用記憶體,使用它們出於改善系統IO效能的目的。當不把二者計入時,系統uesd和free的統計值就是下面的一行(-/+ buffers)因此:uesd:749728=992664-9700-233236,free:25552+9700+233236=268488
最下面的一行表示交換到磁碟空間的記憶體。
而在Android手機上,用法基本相同,是htc chacha 810e(2.3)的執行情況。
bill@Ubuntu10:~/android-sdk-linux_x86/platform-tools$ ./adb shell free;./adb shell cat /proc/meminfo
結果如下:
free命令沒有列出cached這一項,因此第三行(-/+buffers)的第一個值415716表示不計入buffers時uesed的值(即422732-7016=415716),第二個值表示計入buffers時free的值(即12636=5620+7016)。meminfo中包含了Cached的值。
3. 總結
因為Android中的一些新特性,所以其記憶體統計也是基於這些新的用法之上。Android又使用的是Linux核心,所以某些概念容易混淆。
本文連結地址: http://www.redwolf-blog.com/?p=1551
原創文章,著作權紅狼部落格所有, 轉載隨意,但請註明出處。