JavaRush /Java Blog /Random-JA /Java における弱い参照、ソフト参照、ファントム参照、および通常の参照の違い
theGrass
レベル 24
Саратов

Java における弱い参照、ソフト参照、ファントム参照、および通常の参照の違い

Random-JA グループに公開済み
「弱い」参照と「ソフト」参照 (WeakReference、SoftReference) はずっと前にJava API に追加されましたが、すべてのプログラマがこれらに精通しているわけではありません。これは、それらをどこでどのように使用するかについての理解にギャップがあることを示しています。参照クラスは、ガベージ コレクションのコンテキストにおいて特に重要です。ご存知のとおり、ガベージ コレクター自体はオブジェクトによって占有されているメモリを解放しますが、すべてのプログラマーが、ガベージ コレクターがオブジェクトで使用可能な参照の種類に基づいてメモリを解放する決定を下していることを知っているわけではありません。 SoftReferenceWeakReferenceJava の弱いリンク、ソフト リンク、ファントム リンク、および通常のリンクの違い - 1の主な違いは、コレクターがそれらをどのように扱うかです。弱いリンクのみがオブジェクトを指している場合は、いつでもオブジェクトを削除できますが、ソフト リンクを持つオブジェクトは、JVM が本当にメモリを必要とする場合にのみ収集されます。参照クラスのこれらの機能により、それぞれに独自の用途があります。SoftReference はキャッシュを実装するために使用でき、JVM がメモリを必要とする場合、そのようなオブジェクトを削除することでメモリを解放します。また、WeakReferences は、ClassLoader へのリンクの保存など、メタデータの保存に最適です。ロードするクラスがない場合、ClassLoaderへの参照を保存する意味はありません。弱い参照により、強参照の代わりに ClassLoader を割り当てるとすぐに削除できるようになります。この記事では、強参照ファントム参照を含むリンク タイプの違いについて説明します。

Java における WeakReference と SoftReference の比較

知らない人のために説明すると、リンクには次の 4 種類があります。
  1. 強力な参照
  2. 弱参照
  3. ソフトリファレンス
  4. ファントムリファレンス
強いリンクは、私たちが毎日プログラミングで使用するため、最も単純です。たとえば、String s = “abc”のようなコードでは、変数sが強いリンクです。強い参照を持つオブジェクトは、ガベージ コレクターによって削除されることが禁止されています。もちろん、これらはJavaプログラムに必要なオブジェクトです。弱参照はjava.lang.ref.WeakReferenceクラスで表され、次のように弱参照を定義できます。
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
ここで、強参照カウンタを null (counter = null) に設定すると、最初の行で作成されたオブジェクトは強参照を持たなくなるため、ガベージ コレクションに使用できるようになります。Weak によって作成されたweakCounter 参照は、コレクターによる Counter オブジェクトの削除を防ぐことはできません。一方、それがソフト参照の場合、Counter オブジェクトは、JVM が特に多くのメモリを必要とするまで削除されません。Javaのソフト参照は、java.lang.ref.SoftReferenceクラスによって表されます。Javaでの SoftReference の作成例
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
強参照 (3 行目) をクリアした後、Counter オブジェクトへのソフト参照は 1 つだけ残ります。これは、ガベージ コレクターによるこのオブジェクトの削除を防ぐことはできませんが、弱い参照とは異なり、延期することはできます。メモリが深刻に不足するまでこのプロセスが続きます。ソフト リンクと弱いリンクのこの違いを考慮すると、前者はキャッシュに適しており、メタデータには弱いです。良い例は WeakHashMap クラスです。これはHashMapクラスやTreeMapクラスのような Map インターフェイスの子孫ですが、特徴的な機能が 1 つあります。WeakHashMap はキーを弱参照としてラップします。つまり、オブジェクトへの強参照がなくなると、WeakHashMap内にある弱参照はガベージ コレクターから保護されなくなります。ファントム リンクは、java.lang.ref パッケージで使用できる 3 番目のタイプのリンクです。ファントム参照は、java.lang.ref.PhantomReferenceクラスによって表されます。ファントム リンクのみが指すオブジェクトは、コレクターによっていつでも削除できます。ファントムリンクは、弱いリンクまたはソフト リンクと同じ方法で作成されます。
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
DigitalCounter オブジェクトへの強参照をクリアすると、現在はファントム参照のみがそれを指しているため、ガベージ コレクターがいつでもそのオブジェクトを削除します。WeakReference、SoftReference、PhantomReference、WeakHashMap クラスに加えて、ReferenceQueueクラスについて知っておくと役立ちます。このクラスは、WeakReference、SoftReference、または PhantomReference オブジェクトを作成するときに使用できます。
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
オブジェクト参照はReferenceQueueに追加され、ReferenceQueue をポーリングすることで参照の状態を監視できます。Object のライフサイクルは、次の図によく表されています。 JavaJava における弱い参照、ソフト参照、ファントム参照、および通常の参照の違い - 2における弱参照とソフト参照の違いはこれですべてです。また、ファントム リンク、WeakHashMapクラス、およびReferenceQueueについても説明しました。参照を正しく使用すると、ガベージ コレクションに役立ち、Javaでのメモリ管理がより柔軟になります。 原著
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION