起動時にかなり大量の JSON を解析するアプリを開発しました。これにより、ヒープが限界近くまで大きくなります。少し後に、アプリはいくつかのビットマップをロードしています。ビットマップの割り当てと Java オブジェクトの割り当てに同じメモリ領域を使用しているように見える Honeycomb 以降のデバイスでは、JSON 解析に必要なメモリがそれまでに解放されているため、問題は発生していません。ただし、Honeycomb 以前のデバイスでは OutOfMemoryErrors が発生します
ヒープ サイズが決して下がらないため、dalvik は外部割り当て (ビットマップなど) 用に予約されたメモリを増やすことができないようです。
これは、クラッシュのログ出力の一例です
GC_EXTERNAL_ALLOC freed 601K, 81% free 5504K/27591K, external 4809K/5561K, paused 58ms
586224-byte external allocation too large for this process.
ご覧のとおり、ヒープには十分なメモリがありますが、外部割り当てにはあまり使用できません。
dalvik にデフラグとヒープの縮小を強制する方法はありますか? または、外部割り当て用に予約されたメモリではなく、ヒープ上でビットマップ割り当てを強制することはできますか? または、私が見逃しているこの問題に対する他のアプローチはありますか?
** アップデート **
以下は、より多くのログ出力です (特定のデバイスは dalvik-heap メッセージをログに記録しません)。
起動時に JSON が解析されると、dalvik ヒープが大きくなります。
GC_CONCURRENT freed 800K, 19% free 12717K/15687K, external 2637K/2773K, paused 2ms+5ms
GC_CONCURRENT freed 871K, 19% free 13857K/16903K, external 2637K/2773K, paused 2ms+5ms
GC_CONCURRENT freed 1106K, 19% free 14766K/18055K, external 2637K/2773K, paused 3ms+5ms
GC_CONCURRENT freed 818K, 16% free 15946K/18951K, external 2637K/2773K, paused 3ms+6ms
GC_CONCURRENT freed 825K, 15% free 17151K/20167K, external 2637K/2773K, paused 2ms+6ms
GC_CONCURRENT freed 830K, 15% free 18356K/21383K, external 2637K/2773K, paused 2ms+5ms
GC_CONCURRENT freed 814K, 14% free 19519K/22535K, external 2637K/2773K, paused 2ms+6ms
GC_CONCURRENT freed 823K, 13% free 20720K/23751K, external 2637K/2773K, paused 2ms+5ms
GC_CONCURRENT freed 814K, 13% free 21873K/24903K, external 2637K/2773K, paused 3ms+6ms
GC_CONCURRENT freed 813K, 12% free 23016K/26055K, external 2637K/2773K, paused 2ms+5ms
GC_CONCURRENT freed 1771K, 15% free 23205K/27207K, external 2637K/2773K, paused 2ms+5ms
それが完了すると、ほとんどのヒープが再び正常に解放されます。
GC_EXPLICIT freed 19207K, 83% free 4735K/27207K, external 2736K/2773K, paused 140ms
この時点で、20 MB の空き Dalvik ヒープ スペースがあり、少し遅れてビットマップの割り当てを開始します。
GC_EXTERNAL_ALLOC freed 254K, 83% free 4814K/27207K, external 2771K/2773K, paused 47ms
GC_EXTERNAL_ALLOC freed 721K, 83% free 4880K/27207K, external 3881K/4131K, paused 50ms
GC_EXTERNAL_ALLOC freed 235K, 83% free 4870K/27207K, external 5398K/5561K, paused 62ms
デバイスの合計制限は 32 MB のようですが、dalvik ヒープはそれらのうち 27 MB を使用し、ダウンすることはないため、ビットマップを割り当てるための外部メモリ領域が不足しています。