1. ホーム
  2. java

[解決済み] JavaにおけるSoftReferenceとWeakReferenceの違いは何ですか?

2022-03-22 10:41:19

質問

とはどう違うのですか? java.lang.ref.WeakReference java.lang.ref.SoftReference ?

解決方法は?

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

<ブロッククオート

脆弱なリファレンス

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

WeakReference weakWidget = new WeakReference(widget);

そして を使用することができます。 weakWidget.get() を取得し、実際の Widget オブジェクトを作成します。もちろん弱い を参照するほど強くはありません。 ガベージコレクションを防ぐことができます。 強い を参照することで、ウィジェットの weakWidget.get() 突然 戻る null .

...

ソフトリファレンス

A ソフトリファレンス とは全く同じです。 弱参照であることを除けば オブジェクトを捨てようとする を参照する。オブジェクトは 弱くしか到達できない(最も強い への参照は WeakReferences ) は次のガベージで廃棄されます。 しかし は、通常、ソフトリーチ可能です。 がしばらく残る。

SoftReferences はありません。 必須 を使用します。 と同じように動作します。 WeakReferences が、実際にはソフトに リーチャブルオブジェクトは、一般に メモリがある限りは が豊富に供給されます。このため のようなキャッシュの基礎として最適です。 のような、画像キャッシュのような ガベージに任せることができるので コレクターは オブジェクトに到達可能であること(強い 到達可能なオブジェクトは 決して 削除される をキャッシュから削除すること)と、そのキャッシュがどの程度必要であるかということです。 を消費しています。

そして、ピーター・ケスラー氏がコメントで補足してくれた。

Sun JREはSoftReferencesをWeakReferencesと異なる方法で扱います。利用可能なメモリが圧迫されていなければ、SoftReference から参照されるオブジェクトを保持しようとします。一方、-server JRE は、SoftReferences をクリアするよりもヒープを拡張することを優先して、パフォーマンスを高く維持しようとします。1つのサイズですべてに対応できるわけではありません。