主に趣味でスケッチアプリを作っています。しかし、私は問題に遭遇しました。
私のアプリ内で、ユーザーはすでに描いたスケッチを「めくる」ことができます。これらのスケッチは 400x800 のビットマップです。しかし、私は常にメモリ不足エラーに遭遇しています。
スケッチは、ユーザーがスケッチから離れるとすぐに SD に保存され、割り当てが解除されます...
if(bitmap != null)
{
bitmap.recycle();
bitmap = null;
}
そのため、ビットマップを保存して割り当てを解除する前に、一度に 1 つまたは 2 つのビットマップのみをメモリにロードする必要があります。そして、いくつかのデバッグ プリントを使用して、これが正しいと判断しました (同時にメモリ内に最大 2 つのビットマップ)。私の問題は、14 回のロード/割り当て解除の後、プログラムが OutOfMemoryError でクラッシュすることです。「フリップ」の間にどれだけ長く待っても、常に14です。
デバイスのメモリ割り当てがどのようなものかを確認するために、DDMS を開こうとしました。奇妙なことに、イメージの割り当てが解除されるたびに、メモリは「空き」セクションではなく「不明」セクションに移動します。これは、「空き」メモリの断片だけが残るまで続き、その時点でクラッシュが発生します (「不明な」メモリは「空き」になります)。
多くのグーグル検索の後、期待どおりにビットマップの割り当てを解除する必要があり、Dalvik ガベージ コレクションは常にメモリ不足エラーの前に発生するといういくつかのリソースを見つけました。また、Bitmap によって使用されるすべてのメモリが GC で割り当て解除されることを示唆するいくつかのその他のページ (ネイティブおよび JVM ヒープも同様)
この時点で、2 つの異なる電話でテストしていることに注意してください。Motorola Droid X (ストック画像、Android 2.3.3)、および Samsung Galaxy S3 (Cyanogenmod 9、Android 4.0.4)。どちらもまったく同じ動作を示します。私のAndroidツールはすべてのSDKバージョンで最新のものであり、コード内で他に奇妙な割り当てが行われていないことを100万回チェックしました(実際には、プログラムの起動後に何も割り当てられていません)。
では、ビットマップを解放して (「不明」だけでなく)、メモリを他の場所で使用できるようにするには、どのようにビットマップの割り当てを適切に解除する必要がありますか? 一種の補足的な質問として、この「不明な」メモリ プールとは何ですか? また、その目的は何ですか?
編集: 文法とスペル、プラットフォームに関するいくつかのメモを追加しました。