多くの記事を読みましたが、わかりません。実際には、弱およびファントム参照をどこで使用する必要がありますか?ソフト参照-私が理解しているように、キャッシュには良い選択です。しかし、弱くて幻想的で、いつ使うべきかわかりません。それらを使用する必要がある実際のタスクの例を提供してください。
5 に答える
あなたが言ったように、単純にソフト参照のように、キャッシュに弱参照を使用することができます。
PhantomReferencesは何が良いですか?私は彼らにとって2つの深刻なケースしか認識していません。1つは、オブジェクトがいつメモリから削除されたかを正確に判断できることです。実際、それらはそれを決定する唯一の方法です。これは一般的にはそれほど便利ではありませんが、大きな画像を操作するなどの特定の状況で役立つ場合があります。画像をガベージコレクションする必要があることが確実にわかっている場合は、実際にガベージコレクションが行われるまで待ってから次の画像を読み込むことができます。 、したがって、恐ろしいOutOfMemoryErrorの可能性を低くします。
次に、PhantomReferencesは、ファイナライズに関する基本的な問題を回避します。finalize()メソッドは、オブジェクトへの新しい強力な参照を作成することにより、オブジェクトを「復活」させることができます。それで、あなたは何を言いますか?問題は、finalize()をオーバーライドするオブジェクトを収集するには、少なくとも2つの別々のガベージコレクションサイクルでガベージであると判断する必要があることです。最初のサイクルでガベージであると判断されると、ファイナライズの対象になります。ファイナライズ中にオブジェクトが「復活」した可能性があるため(スリムですが、残念ながら現実的です)、オブジェクトを実際に削除する前に、ガベージコレクターを再度実行する必要があります。また、ファイナライズがタイムリーに行われなかった可能性があるため、オブジェクトがファイナライズを待機している間に、任意の数のガベージコレクションサイクルが発生した可能性があります。
詳細については、次のページを参照してください: http ://weblogs.java.net/blog/2006/05/04/understanding-weak-references
基本的に、ソースコードが制御されていないオブジェクトに追加データを関連付ける場合は、弱参照を使用します。弱参照を使用することで、メタオブジェクトのライフサイクルをプライマリオブジェクトのライフサイクルに結合します。
ファントム参照の主な使用例は、デフォルトのメカニズムに関連する危険なしに独自のファイナライザースレッドを実装することです。これにより、到達不能と思われるオブジェクトへの参照をファイナライズコードにアクセスできるようになります。
ソフト参照は主にキャッシング用ですが、ここでの別の投稿で述べられているように、実際には非常に悲惨な影響を及ぼし、キャッシングのポイントそのものを損なう可能性があります。メジャーGC(Soft refをクリアするGC)は通常、アプリのパフォーマンスへのプレッシャーが高まるまで発生しません。これは、キャッシュが最も必要な時間であり、キャッシュを失う可能性が最も高い時間です。
この投稿はあなたの質問にかなりよく答えると思います。
基本的に、ソフト参照は弱参照よりもわずかに強力です。弱参照は次のGCサイクルで破棄されますが、ソフト参照はメモリが不足し、JVMが可能な限り再利用するまでメモリに残ります。
あなたが持っている参照がまだ有効であることがあなたのプログラムにとってどれほど重要であるかについて考える必要があります。参照を再作成するのに非常に安価なものについては、WeakReferenceに傾倒しますが、それがDBからの値である場合は、本当に必要でない限りクエリを再実行したくないので、ソフト参照に傾く可能性があります。
この記事には、この質問に対する優れた回答があります。
SoftReferenceオブジェクトは、すべてのWeakReferenceオブジェクトがガベージコレクションされるまで収集されません。
したがって、重要度の低いオブジェクトをWeakReferenceオブジェクトに配置し、SoftReferenceオブジェクトを使用して重要度の高いオブジェクトを保持します。
これらの事実を考慮すると、ガベージコレクションの観点から必要に応じて、適切な参照オブジェクトを使用する必要があります。WeakReferenceが最初に収集され、次にSoftReferenceが収集され、最後にPhantomReferencesが収集されます。
- ソフト参照は、メモリに依存するキャッシュを実装するためのものです
- 弱参照は、キー(または値)の再利用を妨げない正規化マッピングを実装するためのものです
ちなみに、場合によっては、キャッシュの目的で、SoftReferenceの代わりにWeakReferenceを使用することをお勧めします。これは、キャッシュのメモリが大量になる可能性があるため、クリーンアップする必要があるためです。
PhantomReferenceの場合、使用法は異なります。彼らare for scheduling pre-mortem cleanup actions in a more flexible way than is possible with the Java finalization mechanism.
この記事では、PhantomReferenceの使用方法について少し詳しく説明します。