1概要

このクイック記事では、Javaでのソフトリファレンスについて説明します。

それらが何であるか、なぜそれらが必要なのか、そしてそれらをどのように作成するのかを説明します。

** 2ソフト参照とは

ソフト参照オブジェクト(またはソフト到達可能オブジェクト)は、メモリ要求に応じてガベージコレクタによってクリアされます。

そっと到達可能なオブジェクトはそれを指す強い参照を持っていません

ガベージコレクタは、呼び出されると、ヒープ内のすべての要素に対して繰り返し処理を開始します。 GCは参照型オブジェクトを特別なキューに格納します。

ヒープ内のすべてのオブジェクトがチェックされた後、GCは上記のキューからオブジェクトを削除することによってどのインスタンスを削除するかを決定します。

これらの規則はJVMの実装ごとに異なりますが、ドキュメントには、** ソフト到達可能なオブジェクトへのすべてのソフト参照は、JVMが__OutOfMemoryErrorをスローする前に確実にクリアされることが記載されています。

ただし、ソフト参照がクリアされる時点、またはさまざまなオブジェクトへのそのような参照のセットがクリアされる順序については保証されません。

原則として、JVM実装は最近作成された参照と最近使用された参照のどちらを消去するかを選択します。

やさしく到達可能なオブジェクトは、最後に参照されてからしばらくの間存続します。デフォルト値は、ヒープ内の空きメガバイトあたりの存続期間の1秒です。この値は、


http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc


softrefs[-XX:SoftRefLRUPolicyMSPerMB]__フラグを使用して調整できます。

たとえば、値を2.5秒(2500ミリ秒)に変更するには、次のようにします。

-XX:SoftRefLRUPolicyMSPerMB=2500

弱い参照と比較すると、ソフト参照は追加のメモリが必要になるまで存在し続けるため、寿命が長くなる可能性があります。

したがって、オブジェクトをできるだけ長くメモリに保持する必要がある場合は、それらを選択するほうが適しています。


3ソフトリファレンスのユースケース

  • ソフト管理は、メモリ管理が非常に重要な要素である場合に、メモリ依存のキャッシュを実装するために使用できます。

ソフト参照の参照先が強く到達可能である限り、つまり実際に使用されている限り、参照は消去されません。

たとえば、キャッシュは、最近使用されたエントリがそれらのエントリへの強い参照先を保持することによって破棄されないようにし、残りのエントリはガベージコレクタの判断で破棄されるようにします。


4ソフト参照の取り扱い

Javaでは、ソフト参照はhttps://docs.oracle.com/javase/8/docs/api/java/lang/ref/SoftReference.html[

java.lang.ref.SoftReference

]クラスによって表されます。

初期化する方法は2つあります。

最初の方法は、指示対象のみを渡すことです。

StringBuilder builder = new StringBuilder();
SoftReference<StringBuilder> reference1 = new SoftReference<>(builder);

2番目のオプションは、https://docs.oracle.com/javase/8/docs/api/java/lang/ref/ReferenceQueue.html[

java.lang.ref.ReferenceQueue

]への参照と参照を渡すことを意味します。指示対象に。

参照キューは、ガベージコレクタによって実行されたアクションを認識させるために設計されています

この参照の参照先を削除することを決定したときに、参照キューに参照オブジェクトを追加します。


SoftReference

を__ReferenceQueueで初期化する方法は次のとおりです。

ReferenceQueue<StringBuilder> referenceQueue = new ReferenceQueue<>();
SoftReference<StringBuilder> reference2
 = new SoftReference<>(builder, referenceQueue);



java.lang.ref.Reference


として、メソッドhttps://docs.oracleが含まれています。 .com/javase/8/docs/api/java/lang/ref/Reference.html#get – [

get

]およびhttps://docs.oracle.com/javase/8/docs/api/java/lang/参照先をそれぞれ取得およびリセットするには、ref/Reference.html#clear – [

clear

]を使用します。

StringBuilder builder1 = reference2.get();
reference2.clear();
StringBuilder builder2 = reference2.get();//null

この種の参照を扱うたびに、

get

によって返される参照先が存在することを確認する必要があります。

StringBuilder builder3 = reference2.get();
if (builder3 != null) {
   //GC hasn't removed the instance yet
} else {
   //GC has cleared the instance
}


5結論

このチュートリアルでは、ソフト参照の概念とその使用例に慣れました。

また、作成方法とそれをプログラムで使用する方法についても学習しました。