AndroidメモリのVSS/RSS/PSS/USS


Terms
VSS-Virtual Set Size仮想消費メモリ(共有ライブラリが使用するメモリを含む)RSS-Resident Set Size物理メモリ(共有ライブラリで使用するメモリを含む)を実際に使用
PSS-P r o portional Set Sizeが実際に使用する物理メモリ(共有ライブラリで使用されるメモリの割合)USS-Unique Set Sizeプロセスが独自に使用する物理メモリ(共有ライブラリが使用しないメモリ)一般的にメモリ使用量には、VSS>=RSS>=PSS>=USSという法則があります.
Overview
この記事の目的は、Linuxプロセスが実際にメモリを使用していることについて、さまざまなツールからエクスポートされたレポートを理解することです.
Androidにはprocrank(/system/xbin/procrank)というツールがあり、Linuxプロセスのメモリ使用量を高から低までリストできます.各プロセスは大きさによってVSS,RSS,PSS,USSに分けることができる.
説明を簡単にするために、以下のメモリは「バイト」ではなく「ページ」として表されます.Linuxシステムのメモリ管理の最下位レベルのページは4096バイトです.
VSS(reported as VSZ from ps)は、プロセスが合計でアクセスできるアドレス空間である.そのサイズには、RAMにない可能性のあるメモリも含まれます(たとえば、mallocはスペースを割り当てていますが、まだ書き込まれていません).VSSは、1つのプロセスの実際のメモリ使用量を判断するために使用されることは少ない.
RSSは、プロセスがRAMに実際に格納する総メモリである.しかし、RSSは、プロセスが使用するすべての共有ライブラリのサイズを示すだけで、どのプロセスが共有ライブラリを使用しても、メモリにロードされるのは1回だけです.したがって、RSSは、単一プロセスのメモリ使用量を正確に反映することはできません. 
PSSはRSSとは異なり、使用する共有ライブラリを比例して表します.たとえば、3つのプロセスが1つの共有ライブラリを使用している場合、合計30ページのメモリが消費されます.では、PSSは、各プロセスが共有ライブラリ10ページのサイズを占有していると考えられる.PSSは非常に有用なデータです.システム内のすべてのプロセスのPSSが加算されると、システム内の合計メモリが反映されます.一方、プロセスが破棄されると、共有ライブラリの割合のPSSの一部が占有され、残りのライブラリを使用するプロセスに再び割合で割り当てられます.これにより、PSSは、プロセスが破棄された後、PSSがグローバルシステムに返されるメモリ(the memory returned to the overall system)を正確に表すことができないため、PSSが誤解を招く可能性がある.
USSはプロセスが消費するプライベートメモリです.つまり、プロセスが独占するメモリです.USSは、特定のプロセスを実行する実際の境界コスト(増分コスト)を反映するため、非常に有用なデータです.プロセスが破棄されると、USSは実際にシステムに返されるメモリです.プロセス中に不審なメモリ漏洩がある場合、USSは最適な観察データです.
システムがPythonをサポートしている場合、メモリ以上の分類の統計を報告できるsmemというツールがあります. 
# procrank procrank
PID 	Vss 	Rss 	Pss 	Uss 	cmdline
481 	31536K 	30936K 	14337K 	9956K 	system_server
475 	26128K 	26128K 	10046K 	5992K 	zygote
526 	25108K 	25108K 	9225K 	5384K 	android.process.acore
523 	22388K 	22388K 	7166K 	3432K 	com.android.phone
574 	21632K 	21632K 	6109K 	2468K 	com.android.settings
521 	20816K 	20816K 	6050K 	2776K 	jp.co.omronsoft.openwnn
474 	3304K 	3304K 	1097K 	624K 	/system/bin/mediaserver
37 		304K 	304K 	289K 	288K 	/sbin/adbd
29 		720K 	720K 	261K 	212K 	/system/bin/rild
601 	412K 	412K 	225K 	216K 	procrank
1 		204K 	204K 	185K 	184K 	/init
35 		388K 	388K 	182K 	172K 	/system/bin/qemud
284 	384K 	384K 	160K 	148K 	top
27 		376K 	376K 	148K 	136K 	/system/bin/vold
261 	332K 	332K 	123K 	112K 	logcat
33 		396K 	396K 	105K 	80K 	/system/bin/keystore
32 		316K 	316K 	100K 	88K 	/system/bin/installd
269 	328K 	328K 	95K 	72K 	/system/bin/sh
26 		280K 	280K 	93K 	84K 	/system/bin/servicemanager
45 		304K 	304K 	91K 	80K 	/system/bin/qemu-props
34 		324K 	324K 	91K 	68K 	/system/bin/sh
260 	324K 	324K 	91K 	68K 	/system/bin/sh
600 	324K 	324K 	91K 	68K 	/system/bin/sh
25 		308K 	308K 	88K 	68K 	/system/bin/sh
28 		232K 	232K 	67K 	60K 	/system/bin/debuggerd
#