メモリの消費量のバランス

ZaurusのRAM 64MBでは、Androidはギリ足りないようで、例えばWebブラウザを起動すると、LauncherがLowmemorykillerに惨殺される。Webブラウザからホームに戻ると、Launcherが再起動されるため、数十秒待たされる。Launcherが起動されると、今度は裏に回ったWebブラウザが抹殺される。アプリ間の移動のたびに、Lowmemorykillerが大活躍。おかげで、アプリ切り替え毎に盛大に待たされる。

で、スワップ。思ったよりもいい方向に効果的。アプリ切り替えの待ち時間が激減。DalvikがDexファイルを再ロードするコストより、単純なスワップアウト/インのコストの方が、Android的には少ない。ということか。

http://d.hatena.ne.jp/androidzaurus/20081107/1226048836

安藤恐竜さんからこれを実際に見せてもらった。確かに64MBではほんの少し足りないようで、そのためLowmemorykillerが発動しているようだ。スワップがあるとそのほんの少し足りない分が補われると。Lowmemorykiller はやはり最後の手段なので、落ちてしまうよりはマシだがこれが常に発動するようでは製品としては厳しい。

フラッシュメモリしかストレージがない場合にはそれをスワップバイスにするには、寿命の点で難しいだろうし。

今回の場合は Webブラウザがメモリを食い過ぎるのが直接の原因で、ブラウザのページのキャッシュのサイズか何かをもう少し小さくすることでだいぶよくなるはず。でもこれが固定値で決まっているものだと多少調整したとしてもアプリケーションが少し余計に常駐しただけでバランスが崩れてしまうだろう。

このあたりをもう少し賢く解決しようとするのが、ashmem。
キャッシュのように残っていたら嬉しいが、消されてしまっても構わないようなメモリはashmemを使って'unpin'しておくことでメモリがきつくなったときにはカーネルが自動的に回収して再利用してくれる。現在のソースではまだこれは積極的には使われていないが、おそらくWEBブラウザのページのキャッシュもashmemを使うように実装しなおされるだろう。

それでもなお、実際に製品にするときにはメモリの消費量のバランスをとることは最後のチューニングの課題として残りそう。メモリの状態が手に取るようにわかるツールが必要そうだ。