SoftReferenceを使用してハッシュマップにビットマップを格納すると、BitmapでSoftReferenceが.recycle()を呼び出しますか?ビットマップがHashMapの内部にある場合、特定の状況下でメモリからビットマップを適切にクリアする方法は何ですか?BitmapオブジェクトでSoftReferenceが.recycle()を呼び出しますか
答えて
私はSoftReferenceを使用してハッシュマップ内のビットマップを保存する場合、ビットマップ上.recycle()を呼び出すSoftReferenceのだろうか?
代わりBitmap
のあなたがString
やPOJOを保存する場合は何番?彼らはrecycle
メソッドを持っていますか?もちろん、いいえ。ですから、質問は:SoftReference
は何ですか?
あなたがホストプロセスは、メモリが不足してまで、参照されるオブジェクトが生きて滞在したいときは、
SoftReference
を使用しています。コレクタがメモリを解放するためにを必要とするまで、オブジェクトは収集の対象になりません。大まかに言えば、SoftReference
をバインドするということは、「あなたがもうできなくなるまでオブジェクトを固定する」という意味です。 (link)
あなたは(recycle
メソッドを呼び出す)ビットマップのクリアを気にする必要はありません。 SoftReference
にその作業をさせてください。 Bitmap.recycleドキュメントから
:だから
This is an advanced call, and normally need not be called,
since the normal GC process will free up this memory when there
are no more references to this bitmap.
、弱いビットマップを保持するのには十分です。なんらかの理由で、このリソースを積極的に解放する必要がある場合、弱い参照があります。
EDIT
私はアンドロイドでビットマップの実装に慣れていないんだけど、何がビットマップのリソースに対処するための力のいずれかが明示的にいくつかのメモリをヒープ上に作成されていないという事実であることが起こるかもしれません。 GCを必要とせずにプロセスがメモリ不足になる可能性があります。他の場所から大量のメモリチャンクを保持している小さなオブジェクトを想像してみてください。オブジェクトのファイナライズはメモリを解放する準備ができていますが、VMがGCになる理由はないので、ネイティブメモリは "失われています"。
しかし、弱い参照は、gcの後でのみ処理されるため、弱い参照は役に立ちません。ここで役立つのは、参照カウントの助けを借りて明示的に "リサイクル"することだけです。
私はこれに同意しますが、カスタム作業なしでうまくいくはずです。 –
Bitmapクラスから継承し、finalize()をオーバーライドする方法はありますか? – 2cupsOfTech
どうすればいいですか?ドキュメントに記載されているように、GCはリソースを解放します。ファイナライズは何もしません(オーバーヘッドを追加します)。あなたの意図は何ですか? – mtraut
WeakReferenceによって参照されるオブジェクトがGCになる場合は、ビットマップ上でリサイクルメソッドをトリガーすると仮定します。しかし、私は確信が持てません。ちょうど安全な側にいるために、WeakReferenceクラスをオーバーライドするようなやり方でBitmap固有のWeakReferenceクラスを作成して、refrence時にリサイクルメソッドを呼び出すクラスをGCします。
ソリューションは、このような何かをOOKなければならないが、それは未テストです:
private final class WeakBitmapReference extends WeakReference<Bitmap> {
public WeakBitmapReference(Bitmap b) {
super(b);
}
public void clear() {
Bitmap b = get();
if (b != null && !b.isRecycled())
b.recycle();
super.clear();
}
}
これはうまくいきません。 VMはいつでも「クリア」を呼び出すことはありません。参照キューに追加すると、 "get"は結果を返さなくなるため、どちらも機能しません。 – mtraut
ちょうど私の答えを無視して、mtrautはとにかく正しいです; p –
ビットマップの関連するリソースはGC時に解放されます、それのおかげでfinalize()
方法です。 recycle()
は、もはや必要ではないことが分かっている場合には、それを待たずにリソースを解放することです。メモリが不足している場合は、画像をリサイクルするため、SoftReference
を使用します。
- 1. オブジェクトが呼び出されました
- 2. defrecordコンストラクタで呼び出しを呼び出しますか?
- 3. ArgumentExceptionがBitmapオブジェクト
- 4. setTimeoutを呼び出すと、呼び出しスタックがクリアされますか?
- 5. C++プロジェクトでOpenXMLオブジェクトを呼び出す
- 6. 別のメソッドでオブジェクトを呼び出す
- 7. StrutsアクションでEJBオブジェクトを呼び出す
- 8. Java、オブジェクトをsoftreferenceに変換する
- 9. オブジェクトのメソッドを呼び出しますか?
- 10. Android JNIネイティブコードのC++オブジェクトはガベージコレクションを呼び出しますか?
- 11. MSHTML:JavaScriptオブジェクトのメンバーを呼び出していますか?
- 12. Python:setterが呼び出されたら関数を呼び出しますか?
- 13. 3回の再帰呼び出しを1行で呼び出しますか?
- 14. リダイレクトはstdinが呼び出しを呼び出すのを期待します
- 15. 呼び出し元でクロスAppDomain呼び出しが実行されます。
- 16. 異なる呼び出し規約を持つ呼び出し可能オブジェクト
- 17. strオブジェクトが呼び出せない
- 18. パラメータで呼び出すAjaxクライアント・オブジェクト・メソッド
- 19. 2つのlocationManagerオブジェクトがrequestLocationUpdates(...)を呼び出すとしますか?
- 20. メソッド内で、そのメソッドを呼び出したオブジェクトを探しますか?
- 21. オブジェクトがGC.SuppressFinalizeを呼び出したかどうかを検出できますか?
- 22. Bitmapオブジェクトをjpeg、C#
- 23. PHPはメソッドの呼び出しオブジェクトを取得します
- 24. P /呼び出し呼び出しが停止する
- 25. std :: asyncはstd :: functionオブジェクトを呼び出すことができますか?
- 26. android javascriptメソッドの呼び出しでjsonオブジェクトを渡しますか?
- 27. オブジェクトのプロトタイプチェーン呼び出し可能メソッドはいつですか?
- 28. "TypeError:if文(Python)でメソッドが呼び出されたときに 'str'オブジェクトが呼び出されません '
- 29. オブジェクトのメソッドの呼び出し
- 30. JSON、オブジェクトの配列と呼び出し
romainguyのコメントが見つかりませんでした。ビットマップをクリアするには.recycle()を呼び出す必要がありました。そうしないと、android-devの人に尋ねれば、メモリ問題が発生します。 .recycle()を呼び出さずに問題が出現する – 2cupsOfTech
私は2cupsOfTechに同意します。あなたは間違いなくビットマップ上でリサイクルを呼び出さなければなりませんが、ドキュメンテーションはそれとは逆です。さもなければヒープサイズの小さなデバイスで問題が発生します。 – Apfelsaft