質問: 写真を一定量読み込むとメモリ不足になってしまうのですが という質問をしたものです。 メモリ不足をどうにかしたくてとりあえずAsyncTaskを利用した読み込みを試してます。 まだ写真を元のサイズのまま読み込んでいるので当然Bitmapのサイズが大きいのはまだいいのですが、キャッシュの仕組みを一切実装していないのにもかかわらずメモリの使用量が限界を突破するのがひっかかります。 ヒープダンプを調べてみると相変わらずbyte配列が一番メモリを消費しているらしいのですが、そもそもそのbyte配列を一体誰が作成しているのかを調べる方法はありますか? 多分前ページの何かしらのデータを持ったままになっているのでは?と思うのですが、ページ遷移の時に前ページのデータを破棄するといったことをするとしたらどうすれば良いでしょうか?
回答: メモリはGCが回収するため、明示的に破棄することはできません。 `Bitmap`が確保したメモリですと、解放されるのは、`recyle()`がコールされ不要だとマークされてから、次のGCが実行されるタイミングになります。`recyle()`の後、`System.gc()`でGCの実行を促すことはできますが、確実に実行される保証はありません。 > > ヒープダンプを調べてみると相変わらずbyte配列が一番メモリを消費しているらしいのですが、そもそもそのbyte配列を一体誰が作成しているのかを調べる方法はありますか? > > > 直接メモリの割り当てを行われた箇所を知る方法はないと思いますが、`byte[]`を画像に復元することでどの`Bitmap`が逼迫の原因となっているのかを突き止めることができるかと思います。 Android SDKに付属している、`hprof-conv`と`Memory Analyzer Tool (MAT)`を利用できます。以下のサイトが参考となります。 * Androidでメモリリークの調査と、そのヒープダンプから画像を抽出する - RainbowDevilsLand