可能性のある複製:
弱い参照-それらはどの程度有用ですか?
ガベージコレクタは、いつでも弱い参照を要求できるため、それらを使用する実用的な理由はありますか?
他の場所で使用されている限り、何かへの参照を保持したい場合リスナーの場合、弱参照を使用できます。
WeakHashMapは、派生データへのキーの短期間のキャッシュとして使用できます。また、他の場所で使用されているオブジェクトに関する情報を保持するために使用することもでき、それらのオブジェクトがいつ廃棄されるかわかりません。
BTWソフト参照は弱い参照に似ていますが、すぐにクリーンアップされるとは限りません。 GCは、可能な場合は常に弱い参照を破棄し、可能な場合はソフト参照を保持します。
ファントム参照と呼ばれる別の種類の参照があります。これはGCのクリーンアッププロセスで使用され、クリーンアップ中の「通常の」コードにアクセスできないオブジェクトを指します。
ガベージコレクターはいつでも弱い参照を要求できるため、それを使用する実用的な理由はありますか?
もちろん、それを使用する実用的な理由があります。フレームワークの設計者が非実用的である弱い参照システムを構築するために莫大な費用をかけた場合、それはひどく奇妙になりますか?
あなたが尋ねるつもりだった質問は:
人々が弱参照を使用する現実的な状況とは何ですか?
沢山あります。一般的な方法は、パフォーマンスの目標を達成することです。アプリケーションのパフォーマンスチューニングを行う場合、多くの場合、メモリ使用量と時間使用量をトレードオフする必要があります。たとえば、何度も実行する必要がある複雑な計算があるが、計算は「純粋」であるとします。答えは、外因性の状態ではなく、引数のみに依存します。キャッシュ(引数から結果へのマップ)を作成できますが、それはメモリを使用します。あなたは二度と質問をすることはないかもしれません、そしてそのメモリは無駄になります。
弱い参照は、おそらくこの問題を解決します。キャッシュは非常に大きくなる可能性があるため、同じ質問が何度も聞かれると時間が節約されます。ただし、キャッシュが十分に大きくなり、ガベージコレクタがスペースを再利用する必要がある場合は、安全に再利用できます。
欠点はもちろん、ガベージコレクターのクリーンアップポリシーが、特定のキャッシュの問題ではなく、システム全体の目標を満たすように調整されることです。 GCポリシーと目的のキャッシュポリシーが十分に整合している場合、弱参照はこの問題に対する非常に実用的なソリューションです。
WeakReference がonlyオブジェクトへの参照であり、オブジェクトをぶらぶらさせたい場合は、おそらく使用する必要があります代わりに SoftReference 。
WeakReferencesは、オブジェクトへの他の参照がある場合に最もよく使用されますが、それらの他の参照が使用されなくなったことを検出することはできません(または、その必要はありません)。次に、other参照により、オブジェクトがガベージコレクションされないようにし、WeakReferenceは同じオブジェクトに到達する別の方法になります。
2つの一般的な使用例は次のとおりです。
そのために使用します。この例では、サービスに登録する必要のあるさまざまなリスナーがいます。サービスはリスナーへの弱い参照を保持し、インスタンス化されたクラスは強い参照を保持します。クラスがいつでもGCされる場合、弱い参照はリスナーの残りのすべてであり、その後も同様にGCされます。これにより、中間クラスを簡単に追跡できます。
弱参照の最も一般的な使用法は、「ルックアップ」マップの値です。
通常の(ハード)値参照では、マップ内の値が他の場所への参照を持たなくなった場合、多くの場合、ルックアップはもう必要ありません。弱参照のマップ値では、それに対する他の参照がなくなると、オブジェクトはガベージコレクションの候補になります
マップ自体がオブジェクトへの(唯一の)参照を持っているという事実は、参照がweak参照であるため、ガベージコレクションが停止されることはありません。
メモリリークを防ぐには、詳細を article でご覧ください。
弱参照とは、参照オブジェクトをガベージコレクタによる収集から保護しない参照です
私は一般的に何らかのタイプのキャッシュに使用します。最近アクセスしたアイテムはすぐに利用でき、キャッシュミスの場合はアイテム(DB、FSなど)をリロードします。
WeakSet
を使用して、グラフ内のリンクをエンコードします。ノードが削除されると、リンクは自動的に消えます。