私は Android Honeycomb 用に非常にメモリを集中的に使用するアプリケーションを作成してrecycle()
いBitmap
ます。実際、これはアプリケーションがまったく機能するために必要です。これは、Bitmap
s が絶えずメモリに出入りするためです。しかし、私は に実装onConfigurationChanged()
したばかりActivity
なので、(いくつかの理由から) にメモリ解放ルーチンを入れようとしていますonStop()
。
現在私のonStop()
方法:
View
デフォルトを表示するようにいくつかの を設定しますDrawable
。- これらの によって以前に使用され
recycle()
た に対する呼び出し。Bitmap
View
- sへのヌル参照
Bitmap
。
残念ながら、Eclipse メモリ プロファイラを使用すると、メモリ使用量にはまったく影響がないようです。
ご想像のとおり、名目上はガベージ コレクションが行われる言語でリソースを解放するために多大な努力を払ってきたので、もう少し効果があればと願っていました。だから私の質問は:何をしrecycle()
ますか?それは実際にガベージ コレクションをトリガーしますSystem.gc()
か? それとも、何かを取り除く必要があると感じるまで、システムはメモリを保持しますか (呼び出したとしても)?
注意: s が実際には通常のヒープに保持されていないことはわかっていますが、ネイティブ ヒープから確実に削除するには呼び出しで十分Bitmap
だと思いました。recycle()
答えの一部
にリサイクルされImageView
た が含まれている場合、で が呼び出されるまで、データは引き続きメモリに保持されることがわかりました。これは、またはが呼び出された場合にも当てはまります(それらは比較的小さな 9 パッチでロードされていましたが、MAT 分析では、 のプライベート メンバーに含まれていた大きな が削除されていないことが示されています)。この関数を at で呼び出すだけで、アプリケーションのヒープから約 10 MB が取り除かれました。ただし、これは Android のハニカム以前のビルドには当てはまらないようです。Bitmap
Bitmap
setImageBitmap(null)
ImageView
setImageResource(...)
setImageDrawable(...)
Bitmap
ImageView
onStop()