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. Python呼び出しDLL:TypeError: 'LibraryLoader'オブジェクトが呼び出せません
- 2. 他のオブジェクトからメソッドを呼び出すメソッド呼び出し
- 3. オブジェクトが呼び出されました
- 4. ArgumentExceptionがBitmapオブジェクト
- 5. defrecordコンストラクタで呼び出しを呼び出しますか?
- 6. サービスインタフェースでGetTypeを呼び出すと、呼び出しが発生しますか?
- 7. Twilioは、私が呼び出しオブジェクト(JSON)から記録(URI)を取得したいの呼び出しオブジェクト
- 8. 名前でJava呼び出しオブジェクトを呼び出して使用する
- 9. 呼び出し先が返すオブジェクトのスコープ。呼び出し元ローカル変数?
- 10. 'ListSerializer'オブジェクトが呼び出せません
- 11. 'JavaPackage'オブジェクトが呼び出せません
- 12. Java、オブジェクトをsoftreferenceに変換する
- 13. PythonからC#で書かれた関数を呼び出すとき、 'NoneType'オブジェクトが呼び出せません
- 14. オブジェクト呼び出しメソッドでサブルーチンが呼び出されたかどうかを確認する方法
- 15. MVCでWebAPIメソッドを呼び出してjsonオブジェクトを呼び出す方法
- 16. javaでコンストラクタを呼び出すたびにオブジェクトが作成されますか?
- 17. オブジェクトを関数として呼び出しますか?
- 18. C#でオブジェクトを呼び出すことはできますか?
- 19. オブジェクト内からjQueryを呼び出す
- 20. C#呼び出しから返されたオブジェクトをキャストし、そのオブジェクトのメソッドを呼び出す
- 21. 各メソッド呼び出しでjQueryがコンストラクタを呼び出す
- 22. 呼び出すメソッドは、オブジェクト
- 23. setTimeoutを呼び出すと、呼び出しスタックがクリアされますか?
- 24. React iframe youtube:Object.definePropertyが非オブジェクトで呼び出されました
- 25. 別のメソッドでオブジェクトを呼び出す
- 26. 構成オブジェクトでViewComponentを呼び出す
- 27. C++プロジェクトでOpenXMLオブジェクトを呼び出す
- 28. StrutsアクションでEJBオブジェクトを呼び出す
- 29. SwiftのUITableViewCellでオブジェクトを呼び出す
- 30. Android JNIネイティブコードのC++オブジェクトはガベージコレクションを呼び出しますか?
romainguyのコメントが見つかりませんでした。ビットマップをクリアするには.recycle()を呼び出す必要がありました。そうしないと、android-devの人に尋ねれば、メモリ問題が発生します。 .recycle()を呼び出さずに問題が出現する – 2cupsOfTech
私は2cupsOfTechに同意します。あなたは間違いなくビットマップ上でリサイクルを呼び出さなければなりませんが、ドキュメンテーションはそれとは逆です。さもなければヒープサイズの小さなデバイスで問題が発生します。 – Apfelsaft