Javaでのソフト参照のユースケースは何ですか?JVMをシャットダウンする前に重要な情報をダンプするのに十分なリソースを解放するために、JVMのメモリが不足したときに、重要でないアイテムをガベージコレクションすることは有用でしょうか?
それらはソフト参照と呼ばれていますか?それらはソフトであり、「ストレス下に置かれる」と壊れます。つまり、JVMのメモリが不足しています。弱参照とファントム参照は理解していますが、これらが必要になる場合は実際には理解していません。
Javaでのソフト参照のユースケースは何ですか?JVMをシャットダウンする前に重要な情報をダンプするのに十分なリソースを解放するために、JVMのメモリが不足したときに、重要でないアイテムをガベージコレクションすることは有用でしょうか?
それらはソフト参照と呼ばれていますか?それらはソフトであり、「ストレス下に置かれる」と壊れます。つまり、JVMのメモリが不足しています。弱参照とファントム参照は理解していますが、これらが必要になる場合は実際には理解していません。
1つの用途はキャッシングです。大きなオブジェクトのメモリ内キャッシュを維持したいが、そのキャッシュが他の目的に使用できるメモリを消費したくないと想像してください(キャッシュはいつでも再構築できるため)。オブジェクトへのソフト参照のキャッシュを維持することにより、参照されたオブジェクトをJVMによって解放し、それらが占有していたメモリを他の目的に再利用できます。キャッシュは、壊れたソフト参照に遭遇したときに、それらをクリアする必要があるだけです。
別の用途は、携帯電話などのメモリに制約のあるデバイスでアプリケーションイメージを維持することです。ユーザーがアプリケーションを開くと、以前のアプリケーションイメージをソフト参照として維持できるため、他の目的でメモリが必要な場合はクリアできますが、メモリが必要ない場合は引き続き存在します。これにより、メモリに負荷がかかっていない場合にユーザーがアプリケーションにすばやく戻ることができ、他の何かに必要な場合は前のアプリケーションのメモリを再利用できます。
この記事は私にそれらのそれぞれについての良い理解を与えてくれました(弱い、柔らかい、そしてファントム参照)。要約された引用は次のとおりです。
弱参照とは、簡単に言えば、オブジェクトを強制的にメモリに残すほど強力ではない参照です。弱参照を使用すると、ガベージコレクターの機能を利用して到達可能性を判断できるため、自分で行う必要はありません。
ソフト参照は、参照先のオブジェクトを破棄することにそれほど熱心でないことを除けば、弱参照とまったく同じです。到達可能性が低いオブジェクト(それへの参照が最も強いオブジェクト
WeakReferences
)は、次のガベージコレクションサイクルで破棄されますが、到達可能性が低いオブジェクトは、通常、しばらくの間残ります。ファントム参照は、またはのいずれ
SoftReference
かとはまったく異なりますWeakReference
。オブジェクトに対するグリップが非常に弱いため、オブジェクトを取得することさえできません。そのget()
メソッドは常にを返しますnull
。このような参照の唯一の用途は、それがいつキューに入れられるかを追跡することReferenceQueue
です。その時点で、それが指しているオブジェクトが死んでいることがわかります。
私が考えることができる最も良い例はキャッシュです。メモリが問題になった場合は、キャッシュ内の最も古いエントリをダンプしてもかまいません。大きなオブジェクトのグラフをキャッシュすると、これも発生する可能性があります。
SoftReferenceをキャッシュとして使用する方法の例は、この投稿にあります。