参照キューは、エントリを自動的に削除するために使用されます。
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/ReferenceQueue.html
適切な到達可能性の変更が検出された後、登録された参照オブジェクトがガベージ コレクターによって追加される参照キュー。
基本的に、弱い参照はガベージ コレクターのコア部分であるため、GC スイープが発生すると、未使用の参照が検出されてキューに配置され、それらのキューの内容に基づいてアクションを実行できます。
スレッドは、キューのメソッドに座って、remove
クリーンアップまたはキューを実行する必要があるときにアラートを受け取ることができpoll
ます。
「Java の理論と実践: 弱い参照によるメモリ リークのプラグ」では、次のように説明されています。
の実装はWeakHashMap
、一部の内部オブジェクトが拡張するという、弱参照を使用した一般的なイディオムを示していますWeakReference
。
...
WeakHashMap
マップキーを保持するために弱い参照を使用します。これにより、キーオブジェクトがアプリケーションで使用されなくなったときにガベージコレクションが可能になり、実装は、リターンget()
かどうかによってライブマッピングとデッドマッピングを区別できます。ただし、これは、アプリケーションの存続期間全体にわたって Map のメモリ消費量が増加しないようにするために必要な量の半分にすぎません。キーオブジェクトが収集された後、マップから死んだエントリを削除するために何かを行う必要もあります。そうしないと、Map が無効なキーに対応するエントリでいっぱいになってしまいます。これはアプリケーションからは見えませんが、Map.Entry オブジェクトと値オブジェクトが収集されないため、キーが収集されたとしても、アプリケーションのメモリ不足が発生する可能性があります。WeakReference.get()
null
...
参照キューは、オブジェクトのライフサイクルに関する情報をアプリケーションにフィードバックするガベージ コレクターの主要な手段です。弱参照には 2 つのコンストラクターがあります。1 つは参照対象のみを引数として受け取り、もう 1 つは参照キューも受け取ります。関連する参照キューで弱参照が作成され、参照先が GC の候補になると、参照がクリアされた後、参照オブジェクト (参照先ではなく) が参照キューにエンキューされます。次に、アプリケーションは参照キューから参照を取得し、参照対象が収集されたことを認識して、関連するクリーンアップ アクティビティを実行できるようにします。たとえば、弱いコレクションから除外されたオブジェクトのエントリを消去します。(参照キューは、BlockingQueue と同じデキュー モード (ポーリング、時間制限のあるブロック、時間制限なしのブロック) を提供します。
編集:
キューを使用しても、弱いマップは依然としてリークする可能性があります。 エフェメロンは、弱いキーがそのキーを参照する強力に保持された値を参照するケースを解決する試みです。これらは Java では実装できません。
エフェメロンは、レジストリを使用してプロパティをオブジェクトに「アタッチ」しようとするときによく見られる問題を解決します。一部のプロパティをオブジェクトにアタッチする必要がある場合、そのプロパティは (GC の動作に関して) 通常、このオブジェクトのインスタンス変数の有効期間を持つ必要があります。ただし、オブジェクトとそのプロパティの間に次のような外部関連があるため、これは複雑です。
property --------- registry --------- association --------- object
ここでは、レジストリ (サード パーティ) がアソシエーション自体を保持するため、(自動化されたガベージ コレクションではなく) レジストリから手動で削除する必要があります。この問題は、さまざまな弱い関連付けタイプのいずれかを使用することにより、特定の具体的な状況でいつでも解決できますが、「正しい」種類の関連付けの選択は、動的に変化する可能性のあるさまざまな要因に依存します。
エフェメロンは、エフェメロンの「コンテンツ」(値) が、キーがガベージ コレクションされることが判明するまで強力に保持されるように定義することで、この問題を解決します。それ以降、エフェメロンの内容は弱く保持されます。したがって、エフェメロンの内容は、キーがガベージ コレクション可能である場合にのみ、ガベージ コレクションの対象となります。これは、オブジェクトのインスタンス変数に対して観察される正確な動作です。