Java の SoftReference と WeakReference の違いは何ですか? 質問する

Java の SoftReference と WeakReference の違いは何ですか? 質問する

違いは何ですか?java.lang.ref.WeakReferenceそしてjava.lang.ref.SoftReference?

ベストアンサー1

から弱参照を理解するイーサン・ニコラス著:

弱参照

弱参照とは、簡単に言えば、オブジェクトをメモリ内に残すほど強力ではない参照です。弱参照を使用すると、ガベージ コレクターの到達可能性の判断能力を活用できるため、自分で判断する必要がありません。弱参照は次のように作成します。

WeakReference weakWidget = new WeakReference(widget);

そして、コードの他の場所で、weakWidget.get()実際のオブジェクトを取得するために使用できます。 もちろん、弱参照はガベージ コレクションを防ぐほど強力ではないため、(ウィジェットへの強参照がない場合) が突然 を返し始める場合Widgetがあります。weakWidget.get()null

...

ソフト参照

ソフト参照は弱参照とまったく同じですが、参照先のオブジェクトを破棄する意欲が弱いという点が異なります。弱くしか到達できないオブジェクト (そのオブジェクトへの最も強い参照はWeakReferences) は、次のガベージ コレクション サイクルで破棄されますが、ソフトに到達できるオブジェクトは通常、しばらく残ります。

SoftReferencesは と異なる動作をする必要はありませんWeakReferencesが、実際には、ソフトに到達可能なオブジェクトは、メモリが十分に供給されている限り、一般的に保持されます。これにより、オブジェクトがどの程度到達可能であるか (強く到達可能なオブジェクトはキャッシュから削除されません) と、オブジェクトが消費しているメモリがどの程度必要であるかの両方についてガベージ コレクターに考慮させることができるため、ソフトに到達可能なオブジェクトは、上記のイメージ キャッシュなどのキャッシュの優れた基盤になります。

そしてピーター・ケスラー氏はコメントでこう付け加えた。

Sun JRE は、WeakReferences とは異なる方法で SoftReferences を扱います。使用可能なメモリに負荷がかかっていない場合は、SoftReference によって参照されるオブジェクトを保持しようとします。1 つの詳細: "-client" および "-server" JRE のポリシーは異なります。-client JRE は、ヒープ拡張よりも SoftReferences をクリアすることを優先してフットプリントを小さく保とうとしますが、-server JRE は、(可能な場合は) SoftReferences をクリアするのではなくヒープ拡張することを優先してパフォーマンスを高く保とうとします。1 つのサイズですべてに対応できるわけではありません。

おすすめ記事