« とりあえずソースコード等を貼り付けるサービス | メイン | View 周りのメモリ使用量削減検討 »

2012年04月04日

Android:: メモリと OutOfMemoryError

    

Androidメモ メモリ このページが Android でのメモリについてわかりやすくまとまっている。

ネイティブヒープ + Java ヒープ の合計サイズというのは、Debug.getNativeHeapAllocatedSize() + (runtime.totalMemory() - runtime.freeMemory()) で計算できるサイズのようだ。
この合計値がアプリケーションヒープの最大値を超えた時 OutOfMemoryError 例外が発生する。
アプリケーションヒープの最大値は ActivityManager.getMemoryClass() で得られるもののようだが、runtime.maxMemory() と同じ (単位は異なる) ようなので、runtime.maxMemory() で計算できる。
ActivityManager の方は Context が必要なので、Runtime で得られる方がいろいろと扱いやすい。
つまり、擬似コードで書くのなら以下のような感じ。

Runtime runtime = Runtime.getRuntime();
if( (Debug.getNativeHeapAllocatedSize() + (runtime.totalMemory() - runtime.freeMemory())) > runtime.maxMemory() ) {
 throw new OutOfMemoryError();
}

この辺りがわかるとメモリ限界付近を調査しやすくなる。

Android 3.0 ( APIレベル11 ) から AndroidManifest.xml の application に android:largeHeap="true" を加える事でアプリケーションで使用するHeapサイズを拡大できるが、このサイズは 256MB 辺りのようだ。
上述のページや他のページ、手持ちの TF101 で調べたところ GalaxyNexus、Motorola Xoom(MZ600)、EeePad transformer TF101 で 256MB ということなので、256MB は使えるのではないかと思われる。
調べた範囲では、最低どの程度なのかという仕様は見あたらなかった。

なお、所有端末やネットで調べた範囲だと、アプリケーションヒープは以下のサイズのようだ ( largeHeap指定がない場合 ) 。
Xperia 24MB
Galaxy TAB 48MB
Xperia arc 32MB
IS03 40MB
EeePad transformer TF101 48MB
Galaxy S2 70MB
MEDIAS N-06C 30MB
NEXUS ONE 24MB
NEXUS S 32MB
ATRIX 4G 32MB
IS01 24MB
Optimus chat (L-04C) 24MB



投稿者 Takenori : 2012年04月04日 00:45




comments powered by Disqus
Total : Today : Yesterday : なかのひと