読者です 読者をやめる 読者になる 読者になる

バックグラウンドプロセスが多い時のメモリ使用状況の不思議

SysStats Lite iOS4 iPhone技術情報 SysStats Monitor

SysStats Monitor/SysStats Liteでは、host_statistics()という関数をHOST_VM_INFO指定で呼び出して得られるvm_statistics構造体から、現在のメモリ使用状況を取得して表示しています。アプリをたくさん起動して、バックグラウンドプロセスが多い状態を作ると、以下のような感じになります。

この中で、実際にvm_statistics構造体から取得できる値は空き、現在非使用中、現在使用中、固定中の4項目のみです。最も大きな面積を占めている「その他」は、物理RAM容量(この場合は253MB)から、その4項目の合計を差し引いた値を表示しています。

「その他」という領域を設けた理由については、
SysStats Monitor/Liteの「その他」領域について - The iPhone Development Playground
を参照してください。

この状態から、ホームボタンのダブルクリックで「最近使ったアプリケーション」を表示させ、いくつかのアイコンを削除してプロセスを終了させると、それらのプロセスが確保していたメモリが解放されるはずです。実際には、以下のように表示が変化します。

さて、ここで大きく値が変動したのはどの部分でしょうか?
「その他」が減って、「空き」が増えているところが目立っていますね。それ以外の動きはごくわずかになっています。
このことから、iOSでは、アプリが確保しているメモリの多くは、vm_statistics構造体で見えているものとは異なる仕組みで管理されていることが推測されます。また、iPhone Simulatorでこのアプリを動かした場合は、その他に当たる部分は0になるので、iOS特有のことだと思われます。
同時にこれは、iOSでは、vm_statistics構造体で得られる値の中で、空きメモリサイズ以外の変化は、あまり意味が無いということも言えるかもしれません。iOS4になってからは、バックグラウンドプロセスの数が、かなり増えたので、以前よりもその傾向が強くなっているようにも思います。

このあたりは、開発者向けドキュメントでも説明されておらず、まだ謎に包まれたことが多いので、推測ばかりで何も結論が出ないモヤモヤした話になってしまいましたが、興味がある方にとって、何かのヒントになれば幸いです。