スレッドでビットマップをフェッチし、ビットマップをグローバル メモリ キャッシュに入れるアプリがあります。2.2 エミュレーターでは、十分な数のビットマップ (リストビューにある) を読み込んだ後、再現可能なメモリ不足エラーが発生します。
FATAL EXCEPTION: pool-1-thread-1
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
...
ヒープは安定しているように見えます (3.3mb)。また、2.2 OS ではビットマップ メモリが別の場所に格納されていると思うので、メモリの量が増えているのがわからないのだろうか? hprof ダンプを実行し、MAT でそれらを表示し続けると、オブジェクト カウントは期待どおりに見えます。
ICS 電話でアプリを実行しても、同じ問題は発生しません (ただし、メモリが増えているだけかもしれません)。後のOSでは、ビットマップメモリをヒープの一部として保持していると思いますか?
どちらの場合でも、アプリによって割り当てられた Bitmap インスタンスを確認する方法はありますか? hprof ダンプは、システム全体の合計数を示しているだけだと思います。しかし、それらがどこから割り当てられたのかわかりません。
私は使用しています:
android.support.v4.util.LruCache<String, Bitmap>
memcache として - エントリが削除された後、ビットマップ データがクリーンアップされていないように見えます (キャッシュの上限を 5 MB に設定しました)。ビットマップに recycle() のようなメソッドがあったことを覚えていますが、適切にクリーンアップされていないのでしょうか?
ありがとう