web-dev-qa-db-ja.com

弱参照の実用的な使用はありますか?

可能性のある複製:
弱い参照-それらはどの程度有用ですか?

ガベージコレクタは、いつでも弱い参照を要求できるため、それらを使用する実用的な理由はありますか?

94
user496949

他の場所で使用されている限り、何かへの参照を保持したい場合リスナーの場合、弱参照を使用できます。

WeakHashMapは、派生データへのキーの短期間のキャッシュとして使用できます。また、他の場所で使用されているオブジェクトに関する情報を保持するために使用することもでき、それらのオブジェクトがいつ廃棄されるかわかりません。

BTWソフト参照は弱い参照に似ていますが、すぐにクリーンアップされるとは限りません。 GCは、可能な場合は常に弱い参照を破棄し、可能な場合はソフト参照を保持します。

ファントム参照と呼ばれる別の種類の参照があります。これはGCのクリーンアッププロセスで使用され、クリーンアップ中の「通常の」コードにアクセスできないオブジェクトを指します。

45
Peter Lawrey

ガベージコレクターはいつでも弱い参照を要求できるため、それを使用する実用的な理由はありますか?

もちろん、それを使用する実用的な理由があります。フレームワークの設計者が非実用的である弱い参照システムを構築するために莫大な費用をかけた場合、それはひどく奇妙になりますか?

あなたが尋ねるつもりだった質問は:

人々が弱参照を使用する現実的な状況とは何ですか?

沢山あります。一般的な方法は、パフォーマンスの目標を達成することです。アプリケーションのパフォーマンスチューニングを行う場合、多くの場合、メモリ使用量と時間使用量をトレードオフする必要があります。たとえば、何度も実行する必要がある複雑な計算があるが、計算は「純粋」であるとします。答えは、外因性の状態ではなく、引数のみに依存します。キャッシュ(引数から結果へのマップ)を作成できますが、それはメモリを使用します。あなたは二度と質問をすることはないかもしれません、そしてそのメモリは無駄になります。

弱い参照は、おそらくこの問題を解決します。キャッシュは非常に大きくなる可能性があるため、同じ質問が何度も聞かれると時間が節約されます。ただし、キャッシュが十分に大きくなり、ガベージコレクタがスペースを再利用する必要がある場合は、安全に再利用できます。

欠点はもちろん、ガベージコレクターのクリーンアップポリシーが、特定のキャッシュの問題ではなく、システム全体の目標を満たすように調整されることです。 GCポリシーと目的のキャッシュポリシーが十分に整合している場合、弱参照はこの問題に対する非常に実用的なソリューションです。

29
Eric Lippert

WeakReferenceonlyオブジェクトへの参照であり、オブジェクトをぶらぶらさせたい場合は、おそらく使用する必要があります代わりに SoftReference

WeakReferencesは、オブジェクトへの他の参照がある場合に最もよく使用されますが、それらの他の参照が使用されなくなったことを検出することはできません(または、その必要はありません)。次に、other参照により、オブジェクトがガベージコレクションされないようにし、WeakReferenceは同じオブジェクトに到達する別の方法になります。

2つの一般的な使用例は次のとおりです。

  1. 直接変更することができず、ライフサイクルをほとんど制御できない特定のオブジェクトに関する追加の(多くの場合、高価に計算されるが再現可能な)情報を保持するため。 WeakHashMap は、これらの参照を保持する完璧な方法です。WeakHashMapのキーは弱くしか保持されないため、キーがガベージコレクションされると、値もマップから削除されるため、ガベージになります。集めました。
  2. 「リスナー」が何らかのコーディネーターに登録されているため、何らかのイベントが発生したときに通知を受け取ることができます。ただし、これらのリスナーが来たときにガベージコレクションされないようにしたい場合彼らの人生の終わり。 WeakReferenceは、オブジェクトがまだ生きている間にオブジェクトを指しますが、元のオブジェクトがガベージコレクションされると「null」を指します。
14
Bill Michell

そのために使用します。この例では、サービスに登録する必要のあるさまざまなリスナーがいます。サービスはリスナーへの弱い参照を保持し、インスタンス化されたクラスは強い参照を保持します。クラスがいつでもGCされる場合、弱い参照はリスナーの残りのすべてであり、その後も同様にGCされます。これにより、中間クラスを簡単に追跡できます。

12
Noah

弱参照の最も一般的な使用法は、「ルックアップ」マップの値です。

通常の(ハード)値参照では、マップ内の値が他の場所への参照を持たなくなった場合、多くの場合、ルックアップはもう必要ありません。弱参照のマップ値では、それに対する他の参照がなくなると、オブジェクトはガベージコレクションの候補になります

マップ自体がオブジェクトへの(唯一の)参照を持っているという事実は、参照がweak参照であるため、ガベージコレクションが停止されることはありません。

8
Bohemian

メモリリークを防ぐには、詳細を article でご覧ください。

3
Óscar López

弱参照とは、参照オブジェクトをガベージコレクタによる収集から保護しない参照です

  • 弱い参照によってのみ参照されるオブジェクトは、到達不能(または「弱到達可能」)と見なされるため、いつでも収集できます。
  • 弱い参照は、不要なオブジェクトによって参照されるメモリを保持しないようにするために使用されます。一部のガベージコレクション言語は、Java、C#、Python、Perl、LISPなどのさまざまなレベルの弱参照を備えているか、サポートしています。
  • ガベージコレクションは、メモリリークとデータ破損の可能性を減らすために使用されます。ガベージコレクションには、トレースと参照カウントの2つの主なタイプがあります。参照カウント方式は、指定されたオブジェクトへの参照の数を記録し、参照カウントがゼロになったときにオブジェクトを収集します。一度に1つのオブジェクトしか収集できないため、参照カウントは循環(または循環)参照を収集できません。したがって、他のオブジェクトによって直接参照されておらず、到達できない相互参照オブジェクトのグループは、永続的に常駐することができます。アプリケーションがそのような到達不能オブジェクトの到達不能グループを継続的に生成する場合、メモリリークの影響があります。 グループ内の一部の参照に弱い参照を使用することで参照サイクルを回避する場合、循環参照の問題を解決するために弱い参照を使用できます。
  • また、弱参照は、プログラムが弱参照のみによって重要ではないオブジェクトを示すことができるようにすることで、メモリ内の不要なオブジェクトの数を最小限に抑えるためにも使用されます。
3
Bhushan

私は一般的に何らかのタイプのキャッシュに使用します。最近アクセスしたアイテムはすぐに利用でき、キャッシュミスの場合はアイテム(DB、FSなど)をリロードします。

2
Jan Zyka

WeakSetを使用して、グラフ内のリンクをエンコードします。ノードが削除されると、リンクは自動的に消えます。

0
Neil G