Android
Linux
メモリ管理
メモリ使用量

VSS, RSS, PSS, USS についての説明

メモリ調査

Androidアプリにおける性能測定の一環として、メモリ調査をすることがある。CPUの使用率だとパーセンテージでよくわかるんだけど、メモリ調査は指標が特殊なこともあって、ちょっととっつきにくい。

参考

まずは公式サイトを参照してみる。
debugging-memory | Android Developer

日本語だとatmarkITが詳しい
Android 4.4のメモリ使用状況を把握する3つのツールの使い方|atmark IT

ルートをとってやると、procrankなんかを使うこともある
Android Memory Usage|elinux.org

どれを使えばいいんだ..

一般的な調査だとMAT(Eclipseに付属のもの)なんかを使ってみたり、adbで見てみたりすると思う。でも、これがメモリ消費量だ!みたいなものが出てこない。だいたいのものがpssを出力してくれるんだけど、pssって一体何なんだってのがよくわからないまま進めるのは危険な気がしてくる。

VSS RSS PSS USS の説明

そこで出たのがこの記事

is-this-explanation-about-vss-rss-pss-uss-accurately | StackOverFlow

PSSが何なのか、を知るためには結局他のRSSやUSSなどの算出方法を知っておく必要がある。件の記事では、それを非常にうまく説明してくれていた。

以下に訳をおいておく。


Androidのprocrankと呼ばれるツールがある。これはLinuxのプロセスのメモリ使用量を多いものから順に出力してくれる。メモリ使用量はVSS, RSS, PSS, USSの値をプロセス毎ごとに出力する。

ここでは簡単のために、Byteではなく、「ページ」という単位を使うことにする。LowレベルのLinuxのシステムでは4096Byteを単位とするページがよく用いられる。

VSS(psコマンドではVSZと表現される)はプロセスがアクセスできるアドレスの総和である。このサイズはプロセスがまだ使用していない領域もふくむ。例えばmallocされて割り当てられたものの、まだ書き込まれていないようなメモリだ。したがって、VSSはプロセスの実メモリの使用量としては、あまり使われることはない。

RSSはプロセスが実際に使用しているRAMの総メモリ量である。RSSは誤解を招くことがある。RSSはプロセスが使用しているものと、共有ライブラリが使用しているものを合計し算出するからだ。共有ライブラリは、それを使用するプロセス数とは関係なく、一度しか読み込まれないのにもかかわらず、だ。RSSはある単一のプロセスのメモリ使用量としては正しい表現とはいえないだろう。

PSSは共有ライブラリを適切なサイズに分割し算出する点がRSSと異なっている。例えば、3つのプロセスがある30ページのメモリをもつ共有ライブラリを用いている場合、各プロセスのPSSには、10ページの使用量として計算される。PSSはとても扱いやすい数値だ。システム中の全てのプロセスのPSSを足しあわせた場合、それは実際のシステム中のメモリ使用量に相当するからだ。あるプロセスをキルした場合、各PSSに当分して計算されている共有ライブラリは、依然としてライブラリを用いている他の残っているプロセスの等分に分配される。この場合、PSSはわずかに誤解をまねく。プロセスをキルした場合にシステムに戻るメモリ量としてはPSSは正しい指標ではなくなってしまうからだ。

USSはプロセスに完全に一意であるようなプライベートなメモリ使用量である。USSは動作中のプロセスが使っている真のコストを表しているため、かなり使いやすい数値である。プロセスがキルされた場合、USSで表されたメモリ量はシステムに還元される。そのため、USSはプロセスのメモリリークを疑った場合に最初に見る値としては最も使いやすい。

参考

本記事は僕の旧ブログからの転載です。
ブログ閉鎖に伴い、こちらに色々記事を移していく予定です。