2012年11月28日水曜日

Androidアプリ開発でのメモリ使用量確認

どうも、俺@残業中で腹減ったです。
最近はAndroidアプリ開発にも手を出しています。eclipse超高機能で便利ですね。

さて、Androidアプリを開発してるとOutOfMemoryに悩まされる開発者の方々多いのではないでしょうか。
僕も悩みまくっていまして、ググると大量に関連した記事が出てきます。
Xcodeだとinstrumentsというツールでメモリリークを調べたりできますが、もちろんeclipseでも可能です。
という訳で、それらをまとめてアプリのメモリ使用量について確認したいと思います。

※環境
Mac OSX 10.8.2
eclipse JUNO SR 1

その1)DDMS
実機転送またはエミュレータでアプリ起動中に、eclipseのDDMSでメモリ量を確認できます。
まずDDMS画面に切り替えます。

次に左側のペインから対象のアプリパッケージを選択します。
※開発中のものがあるので画像加工しています。。

そして、その上部にある「Update Heap」をクリック。

そして、その右側にあるペインから「Heap」タブを選択し「Cause GC」をクリックします。
これはGCが走らないとHeap状況が出ないからなので、GCが走るのを待っても良いです。

そうするとGCが走る度にメモリ使用量が更新されていきます。

HeapSizeは確保されているメモリ量で必要に応じてメモリが確保され増えていきます。
増え続けると限界値まで増えます。
限界値は
Runtime.getRuntime().maxMemory()
で確認可能。
限界値はエミュレータの場合は、Android Virtual Device Managerで設定するMax VM application heap sizeです。


Allocatedは使用中のメモリ量です。
このDDMSでどのくらいHeapが確保されていて、どのくらい使われているのかを確認します。
ちなみにここで言うHeapはDalvikヒープのことを指しているようです。

Androidアプリ自身には、
・ネイティブヒープ
・Dalvikヒープ
の2種類のヒープがあるようです。
あと端末自体に割り当てられているLinuxヒープというのもありますが。

■ネイティブヒープ
Andorid3.0以前であれば、主にBitmapデータを確保するために利用されます。
// 全体ネイティブサイズ
Debug.getNativeHeapSize();

// 使用中ネイティブヒープサイズ
Debug.getNativeHeapAllocatedSize();

// 空きネイティブヒープサイズ
Debug.getNativeHeapFreeSize();
で確認できます。
■Dalvikヒープ
クラスのインスタンスやBitmap(Android3.0以降)データを確保するために使われます。
// 確保されたDalvikヒープサイズ
Runtime.getRuntime().totalMemory();

// メモリが足りない場合に確保しようとする最大のDalvikヒープサイズ
Runtime.getRuntime().maxMemory();

// 空きDalvikヒープサイズ
Runtime.getRuntime().freeMemory();

// 使用中Dalvikヒープサイズ
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
で確認できます。
このネイティブヒープとDalvikヒープの使用合計サイズが最大値を超えるとOutOfMemoryが発生してしまうのです。
Androidのバージョンが低い端末だと、割り当てられるメモリ量が少ないために、画像生成時などにメモリ枯渇によりアプリが落ちてしまう事が多々あるようです。
特にBitmap系でのOutOfMemoryの場合は、画像サイズをいかに小さくするかで割りと解決出来たりします。


以上でぇぇえぇす。

0 件のコメント: