Android中的記憶體使用量狀況統計

來源:互聯網
上載者:User
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

原創文章,著作權紅狼部落格所有, 轉載隨意,但請註明出處。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.