7

WeakReferenceを(アンドロイド)ビットマップキャッシュの一部として使用して、ビットマップが使用されなくなったときをチェックできるようにします。WeakReference#get()はいつnullを返し始めますか?

キャッシュの最大サイズは、Javaヒープスペースよりも小さくなっています。新しいビットマップがキャッシュをオーバーフローすると、それはもはや必要とされないビットマップを放棄するはずです。

私の質問:WeakReferenceのget()メソッドはいつnullを返しますか?

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

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

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

答えて

10

答えは、使用しているAndroidのバージョンによって異なります。 2.3のタイムフレームのどこかで、Androidはハンドリングや弱い参照を変更しました。以前は、GC実行時に削除されていました。 2.3のいくつかのバージョン(2.3.3?)では、最後の強力な参照がなくなると直ちにそれらを削除し始めました。 Androidの現代版では、弱い参照は役に立たない。

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

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

+0

ソフトリファレンスはキャッシュ用です。 Androidでの行動はどうですか? –

+2

同じものは、強い参照が存在しなくなるとすぐに解放されます。 Java標準の手紙に従っています。 –

+0

変更がAPIレベル9にありました。関連ドキュメント:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html#memory-cache – Delyan

5

WeakReferenceは、オブジェクトが弱く到達可能であるとGCが判断するとすぐに消去されます。

これは、2番目のケースに近いです。しかし、弱い到達可能性には、強い参照がないだけでなく、柔らかい参照がないことも必要です。 java.lang.refのためのJavaパッケージのドキュメントから

ソフトと弱い参照を自動的に任意の場合、彼らは、登録されてキューに追加される前にコレクタによってクリアされます。それはどちらも強くもそっと到達可能であるが、弱参照をトラバースすることで到達できる場合

...

オブジェクトは、弱く到達可能です。弱く到達可能なオブジェクトへの弱い参照がクリアされると、オブジェクトはファイナライズに適格になります。

+1

これはJavaの観点からは正しいが、Androidのすべての話ではない。 Androidがこれらを具体的にどのように実装し、過去にどのように変更されたかについての投稿を参照してください。 –

4

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

+0

+1 - ライブラリ全体の弱い参照を一度ソフトに置き換える必要があったことを言及しておくべきです。 –

-3

他の回答に記載されているように、指し示されたオブジェクトに強い/柔らかい参照がなくなると、WeakReferenceはnullを返します GCは再生メモリを持ちます。

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

  • アプリケーションは、JVMとのDalvikは、メモリ管理やコードの最適化についてです
  • ビジネスロジックについてです。

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

代わりに固定サイズ(要素数またはビットマップサイズ)のLRUキャッシュを使用することができます。

希望に役立ちます!

+2

Gabe SechanはAndroidに最適な答えを提供します。また、アプリケーションにはビジネスロジック以上のものがあり、弱/ソフトリファレンスには用途があります。 –

+2

'あなたのアプリケーションはビジネスロジックに関するものです'というのはちょっと想定しています。モバイルアプリケーションは必ずしも常用のWebサービスラッパーではなく、ウィークリファレンスは、モバイルとサーバーの両方で、パフォーマンスに重要なアプリケーションで多くの用途を見いだす揮発性キャッシュの重要な概念です。 –

関連する問題