0

10Mb の空きメモリがあるのに、4Mb の割り当てで OutOfMemoryError が発生する理由がわかりませんでした。なんで?(アンドロイド 4.1.2)

ログファイル:

11-10 14:37:12.503: D/MyApp(1570): debug. =================================
11-10 14:37:12.503: D/MyApp(1570): debug.heap native: allocated 3.32MB of 16.61MB (0.35MB free)
11-10 14:37:12.503: D/MyApp(1570): debug.memory: allocated: 30.00MB of 32.00MB (8.00MB free)
11-10 14:37:12.524: D/dalvikvm(1570): GC_FOR_ALLOC freed 10K, 29% free 22176K/31111K, paused 16ms, total 16ms
11-10 14:37:12.524: I/dalvikvm-heap(1570): Forcing collection of SoftReferences for 4431036-byte allocation
11-10 14:37:12.533: D/dalvikvm(1570): GC_BEFORE_OOM freed <1K, 29% free 22176K/31111K, paused 11ms, total 11ms
11-10 14:37:12.533: E/dalvikvm-heap(1570): Out of memory on a 4431036-byte allocation.
11-10 14:37:12.533: I/dalvikvm(1570): "Thread-67" prio=5 tid=10 RUNNABLE
11-10 14:37:12.533: I/dalvikvm(1570):   | group="main" sCount=0 dsCount=0 obj=0xb59cfd68 self=0xb8e22fd8
11-10 14:37:12.533: I/dalvikvm(1570):   | sysTid=1587 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1193135816
11-10 14:37:12.533: I/dalvikvm(1570):   | schedstat=( 0 0 0 ) utm=245 stm=91 core=0
11-10 14:37:12.533: I/dalvikvm(1570):   at android.graphics.Bitmap.nativeCreate(Native Method)
11-10 14:37:12.533: I/dalvikvm(1570):   at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
...
11-10 14:37:12.533: W/dalvikvm(1570): threadid=10: thread exiting with uncaught exception (group=0xb4ef4288)
11-10 14:37:12.543: E/AndroidRuntime(1570): FATAL EXCEPTION: Thread-67
11-10 14:37:12.543: E/AndroidRuntime(1570): java.lang.OutOfMemoryError
11-10 14:37:12.543: E/AndroidRuntime(1570):     at android.graphics.Bitmap.nativeCreate(Native Method)
11-10 14:37:12.543: E/AndroidRuntime(1570):     at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
11-10 14:37:12.543: E/AndroidRuntime(1570):     at android.graphics.Bitmap.createBitmap(Bitmap.java:620)
4

2 に答える 2

2

OutOfMemoryError要求されたサイズを満たす単一の連続したヒープ領域のブロックがない場合、 が返されます。これは、使用可能なヒープ領域がまだ十分にある場合に発生する可能性がありますが、すべて一連の小さな不連続ブロックです。

たとえば、3K ヒープがあり、A、B、C の 3 つの 1K 割り当てを行うとします。現在、3K ヒープの 3K をすべて使用したため、ヒープは使い果たされています。

これで、A がガベージ コレクションされます。私たちのヒープには、1K ブロックに 1K の空き領域があります。1.5K ブロックを割り当てようとすると、OutOfMemoryError全体的にヒープ領域が不足しているため、 が返されます。

今、Cはガベージコレクションされます。ただし、A と C は連続していません。B はそれらの間にあります。A と C のメモリを 1 つのブロックに結合することはできません。したがって、2K のヒープ領域が利用可能であってもOutOfMemoryError、1.5K の割り当て要求では失敗します。これは、目的のサイズを満たす連続したメモリ ブロックが 1 つもないためです。B もガベージ コレクションを取得した場合にのみ、ブロックが合体して 3K ヒープに戻り、その時点で 1.5K の割り当てを許可できます。

これが、Android で大きな画像やその他の大きなブロックを処理する場合 (たとえばinBitmapBitmapOptions.

于 2013-11-10T15:34:56.127 に答える
0

このエラーには多くの理由があり、私たち全員が知っているように、これは高精細画像の読み込み中に直面する非常に一般的な問題であるか、またはビットマップの一貫した使用が原因であり、これに対する解決策は次のとおりです。

  1. 低解像度の画像を使用します。
  2. ビットマップのサイズ変更とリサイクル。

これに関するいくつかの便利なリンクがあります: メモリリークとメモリ不足エラー

List、LinkedList、および HashMap を使用したメモリ リークおよびメモリ不足エラー

LRU キャッシュを使用したメモリ リークおよびメモリ不足エラー

ディスク LRU キャッシュを使用したメモリ リークおよびメモリ不足エラー

于 2013-11-10T17:57:03.673 に答える