19

私は最近、WeakReferences を使用した Java コードに出くわしました。それらが導入されたときに出くわしたことはありましたが、それらが展開されているのを見たことはありませんでした。これは日常的に使用するものですか、それともメモリの問題が発生した場合にのみ使用する必要がありますか? 後者の場合、簡単に改造できますか、それともコードを大幅にリファクタリングする必要がありますか? 平均的な Java (または C#) プログラマーは一般的にそれらを無視できますか?

編集WR を過度に熱狂的に使用すると、何らかの損害が発生する可能性がありますか?

4

4 に答える 4

25

弱参照はすべてガベージ コレクションに関するものです。標準オブジェクトは、それへのすべての参照が切断されるまで「消える」ことはありません。これは、ガベージ コレクションがガベージと見なす前に、さまざまなオブジェクトへのすべての参照を削除する必要があることを意味します。

オブジェクトが他のオブジェクトによって参照されているという理由だけで弱い参照を使用しても、必ずしもそれがガベージではないことを意味するわけではありません。GC によって取得され、メモリから削除される可能性があります。

例: アプリケーションに多数の Foo オブジェクトがある場合、 Set を使用して、周りにあるすべての Foo の中央レコードを保持したい場合があります。しかし、私のアプリケーションの他の部分が Foo オブジェクトへのすべての参照を削除することによってオブジェクトを削除するとき、私は Set がそのオブジェクトに対して保持している残りの参照がガベージ コレクションされないようにしたくありません! 本当に私はそれが私のセットから消えて欲しいだけです. これは、「強い」参照の代わりにそのメンバーへの弱い参照を使用する代わりに、弱いセット (Java には WeakHashMap があります) のようなものを使用する場所です。

必要なときにオブジェクトがガベージ コレクションされていない場合は、帳簿の管理に誤りがあり、削除するのを忘れた参照がまだ何かに保持されています。弱参照を使用すると、オブジェクトを「生きている」状態に保ち、ガベージコレクションを解除することを心配する必要がないため、このような簿記の苦痛を和らげることができますが、それらを使用する必要はありませ

于 2009-10-29T00:25:43.513 に答える
17

オブジェクトを自分で維持せずに、オブジェクトへの参照が必要な場合はいつでもそれらを使用します。これは多くのキャッシングに似た機能に当てはまりますが、イベントをサブスクライブすることによってサブスクライバーが存続することのないイベント処理においても重要な役割を果たします。

小さな例: 一部のデータを更新するタイマー イベント。通知を受け取るために任意の数のオブジェクトがタイマーにサブスクライブできますが、タイマーにサブスクライブしたという事実だけでそれらを存続させてはなりません。したがって、タイマーはオブジェクトへの弱い参照を持つ必要があります。

于 2009-10-29T00:08:51.437 に答える
10

WR を過度に熱狂的に使用することによって何らかの損害が発生する可能性はありますか?

はい、できます。

懸念事項の 1 つは、弱い参照によってコードが複雑になり、エラーが発生しやすくなる可能性があることです。弱参照を使用するコードは、使用するたびに参照が壊れる可能性に対処する必要があります。弱参照を使いすぎると、余分なコードをたくさん書くことになります。(チェックを処理し、破棄されたオブジェクトをオンデマンドで再作成するメソッドの背後に各弱い参照を隠すことで、これを軽減できます。しかし、これは必ずしもそれほど単純ではない可能性があります。たとえば、再作成プロセスにネットワークが関係している場合などです。再作成失敗の可能性に対処する必要があります。)

2 つ目の懸念は、弱参照を使用すると実行時のオーバーヘッドが発生することです。明らかなコストは、弱い参照を作成getしてそれらを呼び出すことです。あまり明白でないコストは、GC を実行するたびにかなりの余分な作業を行う必要があることです。

最後の懸念は、アプリケーションが将来必要とする可能性が非常に高いものに弱参照を使用すると、それを繰り返し再作成するコストが発生する可能性があることです。このコストが高い場合 (CPU 時間、IO 帯域幅、ネットワーク トラフィックなどの点で)、結果としてアプリケーションのパフォーマンスが低下する可能性があります。JVM により多くのメモリを割り当て、弱い参照をまったく使用しない方がよい場合があります。

もちろん、これは弱参照の使用を完全に避けるべきだという意味ではありません。慎重に考える必要があるというだけです。そしておそらく、最初にアプリケーションでメモリ プロファイラを実行して、メモリ使用量の問題がどこから生じているかを突き止める必要があります。

于 2009-10-29T00:47:52.950 に答える
1

WeakReference の使用を検討する際に尋ねる良い質問は、オブジェクトへの強い参照が存在しない瞬間に弱い参照が無効になった場合にどのように感じるかということです。それが WeakReference の有用性を低下させる場合、WeakReference はおそらく使用するのに最適なものではありません。それがガベージ コレクションに起因する非決定論的な無効化よりも改善される場合、WeakReference はおそらく正しい選択です。

于 2011-02-19T00:10:25.567 に答える