newだけ知ってる?Javaには4種類の参照があります

2050 ワード

私たちはよくnewでオブジェクトを作成します.
実際、newへの参照は、「強参照」とも呼ばれ、以下のrefは、強参照である.
Object ref = new Object();

強いリファレンスは、私たちが最もよく使用するリファレンスタイプであり、4つのリファレンスレベルの中で最も高いリファレンスタイプでもあります.
 
4つの引用、およびそれらの強弱関係は以下の通りである.
強参照>ソフト参照>弱参照>ダミー参照
 
1.強引用
強引用、強はどこですか?強在「JVMはメモリが溢れても、GCが強参照オブジェクトが占有するメモリ領域を勝手に回収することはない」.その理由も分かりやすく、GCが上記のrefを回収した場合、new Object()というオブジェクトは意味がなく、後続のrefを使用するすべてのコードもエラーになります.
強引用、いつ失効しますか?GCは、強参照の値がnullに設定されているか、またはスコープが無効になっている場合にのみ、強参照オブジェクトを回収の範囲に含めます.
 
2.ソフトリファレンス
JVMのメモリが十分な場合、GCはソフトリファレンスと強いリファレンスに対して同じ方法で、ソフトリファレンスオブジェクトをアクティブに回収しません.ただし、JVMのメモリが不足すると、GCはソフトリファレンスオブジェクトをアクティブに回収します.
JVMはOutOfMemoryを放出する前にソフトリファレンスオブジェクトを回収するだけであることも理解できます.
強いリファレンスはキーワードnewで直接生成できますが、ソフトリファレンスはJDKが提供するjava.lang.ref.SoftReferenceを借りる必要があります.
ソフトリファレンス、弱リファレンス、および後述するダミーリファレンスには、参照が指す参照オブジェクトを取得するためのget()メソッド(実際には親Referenceを継承するメソッド)があります.以下に,get()メソッドによりソフトリファレンスが指すObjectDemoオブジェクトを取得する.
class ObjectDemo {
   public void method(){}
}

public class ReferenceDemo {
   public static void main(String[] args) throws Exception {
       SoftReference softReference = new SoftReference<>(new ObjectDemo());
       ObjectDemo obj =  softReference.get();
  }
}

 
3.弱引用
弱参照はJDKでjava.lang.ref.WeakReferenceクラスを指します.GCがゴミ回収を行う場合,その時点でJVMのメモリが十分であるか否かにかかわらず,弱い参照オブジェクトを自発的に回収する.
 
4.虚参照
ダミーリファレンスはJDKでjava.lang.ref.PhantomReferenceクラスを指し、ダミーリファレンスは幻影リファレンスまたは幽霊リファレンスとも呼ばれる.ダミーリファレンスは、すべてのリファレンスレベルの中で最も低く、「ダミーリファレンスを使用するかどうかは、オブジェクト自体にとって何の違いもありません」としても、ダミーリファレンスを使用してオブジェクトインスタンスを取得することはできません.ダミーリファレンスは、一般にリファレンスキュー(ReferenceQueue)とともに使用されます.GCがオブジェクトを回収するときに、そのオブジェクトにダミーリファレンスが存在することが判明すると、そのオブジェクトを回収する前にそのダミーリファレンスを対応するリファレンスキューに格納し、そのダミーリファレンスがキューから出る前に対応するダミーリファレンスオブジェクトは回収されません.したがって,参照キュー内のダミー参照の数を解析することによってGC回収の頻度を推定したり,ダミー参照オブジェクトが回収される前に追加の操作を行ったりすることができる.
 
本文は慕課コラム「Java秒殺システムをどのように設計するか」を引用し、著者:顔群、
原文住所:http://www.imooc.com/read/56  (左下の「原文を読む」をクリックして直通)