11

WeakReference(Android) ビットマップ キャッシュの一部として s を使用して、ビットマップが使用されなくなったことを確認できるようにしたいと考えています。

キャッシュの最大サイズが Java ヒープ領域より小さいです。新しいビットマップがキャッシュをオーバーフローする場合、不要になったビットマップを解放する必要があります。

私の質問: get() メソッドがWeakReferencenull を返すのはいつですか?

  1. オブジェクトへの強い参照がなくなるとすぐに? (そしてGCはまだ発生していません)
  2. または、GC が実行され、オブジェクトへの強い参照がなくなったと判断されたときは?

2. が true の場合、キャッシュがいっぱいになる可能性があり、何らかの理由で GC が最近実行されていないという状況に遭遇する可能性があります。

次に、最後の GC 実行後に参照を既に手放していたとしてもWeakReference#get()、オブジェクトを返し、キャッシュはそれをクリアしません。

4

4 に答える 4

13

答えは、使用している Android のバージョンによって異なります。2.3 タイムフレームのどこかで、Android はその処理または弱参照を変更しました。以前は、GC の実行時にそれらを削除していました。2.3 (2.3.3?) のいくつかのバージョンの時点で、最後の強い参照がなくなるとすぐにそれらを削除し始めました。したがって、最新バージョンの Android では、弱参照は役に立ちません。

この変更の前は、キャッシングに弱参照が使用されていました。それらはもはや機能しません。現在の正しい方法は、LRUCache を使用することです。古いバージョンをサポートする必要がある場合は、サポート ライブラリを使用して LRU キャッシュをバックポートします。

いくつか検索した結果、変更は 2.3 ではなく 3.0 で行われたと思います。それでも、解決策は同じです。

于 2013-05-23T19:08:27.367 に答える
5

ビットマップをキャッシュするには、Weak ではなく SoftReference を使用します。GC は、キャッシュの目的を破壊する可能性のあるすべての Strong および Soft 参照を失うとすぐに WeakReference をクリアします。SoftReference は、メモリが少ない場合にのみクリアされます。また、OOME をスローする前に GC が実行されることが保証されます。

于 2013-05-23T19:09:59.713 に答える
-3

他の回答で述べたように、ポイントされたオブジェクトに強い/ソフト参照がなくなり、GC がメモリを回収すると、WeakReference は null を返します

より一般的なルールとして、Weak/SoftReferences はアプリケーションにとって良いことではないと思います。それはあなたのミックスの懸念になります:

  • あなたのアプリケーションはビジネスロジックに関するものです
  • JVM と Dalvik は、メモリ管理とコードの最適化に関するものです。

Weak/Soft 参照の使用を開始すると、アプリケーション内にメモリ管理の問題が発生し、開発/デバッグ/理解が難しくなります。

代わりに、固定サイズ (要素数またはビットマップ サイズ) の LRU キャッシュが必要になる場合があります。

それが役立つことを願っています!

于 2013-05-26T09:04:34.283 に答える