ベストアンサー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 つのサイズですべてに対応できるわけではありません。