使用メモリを調べる
■ メモリを知ることの重要性
アプリを作成するにあたり、メモリを管理することは非常に重要です。なぜなら、メモリを逼迫するようなことがあれば、そのアプリは有用性に掛けると考えられるからです。
きちんとしたアプリを作成するなら、きちんとメモリを使用量を把握し、OutOfMemory等のエラーが発生しないように管理することが大切です。でないと、あらゆる端末上で正常に動くアプリではなくなる可能性があります。
■ Androidにおける管理すべきメモリについて
Androidで管理すべきメモリは大きく二つあります。ひとつはLinuxヒープ(Javaヒープ)。もうひとつはDalvikヒープです。
まずはLinuxヒープです。これは、Linux管理下のヒープになります。そして、このヒープがある一定の閾値を下回ってしまうと、いわゆるLowMemoryKillerが発生し、プロセスをkillしていきます。
次にDalvikヒープです。、これは、DalvikVMが管理しており、一つのプロセスに割り当てるメモリの制限を管理しています。DalvikヒープはLinuxヒープから取ってきますが、管理の対象はプロセスであり、ひとつのプロセスがメモリの最大値を超えてしまうとOutOfMemoryが発生します。
重要なのは、Dalvikヒープのほうです。
ここで、注意すべきはOSのバージョンによりGC(ガーページコレクション)のタイミングや動きが違う為、リソースのrecycleをきちんと行っていても、これらのメモリオーバーエラーに引っかかる可能性があります。
わしが考えるひとつのプロセスの使用していいメモリは、15MBです(完全に独断です。参考までに)。
■ DDMSを使ってメモリの確認を行う
DDMSを使って簡単にメモリ使用状況を確認することができます。まずはeclipseのパースペクティブから「DDMS」を選択しましょう。
この画面でいえば、左上にプロセスがずらっと並んでいます。分析したいプロセスを「Update Heap」のアイコンを使って選択します。
ここでは、Launcherアプリを選択してみました。すると画面右側に、プロセスの情報が表示されます。
表示されない場合は、中央右くらいのところにある「Cause GC」ボタンを押して、強引にGCを走らせてください。
GCを走らせた後のメモリ使用量が、型毎に一覧として出てきます。想定していないメモリの確保がある場合、その型を調べるわけですが、コツは、とりあえず、「Largest」タグにあまりにも大きすぎるものがないかをチェックしましょう。
■ ADBを使ってメモリを計測する(おまけ)
もっと大雑把にヒープ使用量を知りたいのであれば、adbを使う手もあります。procrankです。
$ procrank
プロセスが一覧で表示されました。プロセスが確保しているメモリは「Uss」です。
余談ですが、もっと詳細な情報が必要であれば、
$ dumpsys meminfo
があります。ここでは詳しい説明はしませんが、興味があれば、試してみてください。