JAVAでの強引用、弱引用、ソフト引用、虚引用

3040 ワード

1.強引用本章の前文で紹介した引用は、実際には強引用であり、最も一般的な引用である.オブジェクトに強い参照がある場合は、必要不可欠な生活用品に似ており、ゴミ回収器は決して回収されません.メモリ容量が不足している場合、Java仮想マシンはOutOfMemoryErrorエラーを投げ出してプログラムを異常に終了させ、強い参照を持つオブジェクトを勝手に回収してメモリ不足の問題を解決することはありません.2.ソフトリファレンス(SoftReference)オブジェクトがソフトリファレンスのみを持っている場合は、物のある生活用品に似ています.メモリ容量が十分であれば、ゴミ回収器は回収されず、メモリ容量が不足している場合は、これらのオブジェクトのメモリが回収されます.ゴミ回収器が回収していない限り、そのオブジェクトはプログラムで使用できます.ソフトリファレンスは、メモリに敏感なキャッシュを実現するために使用できます.
ソフトリファレンスはリファレンスキュー(ReferenceQueue)と組み合わせて使用できます.ソフトリファレンスが参照するオブジェクトがゴミ回収されると、Java仮想マシンはこのソフトリファレンスを関連するリファレンスキューに追加します.
 public static void main(String[] args){
  //       
  SoftReference<Person> [] p = new SoftReference[100]; //100000
  //    
  for(int i = 0; i< p.length ;i++){
   p[i] = new SoftReference<Person>(new Person("name"+i ,i));
  }
  
  //  
  System.out.println(p[1].get());
  System.out.println(p[4].get());
  //        
  System.gc();
  System.runFinalization();
  
  System.out.println("---------------");
  System.out.println(p[1].get());
  System.out.println(p[4].get());
 }

3.弱い参照(WeakReference)オブジェクトが弱い参照のみを持っている場合は、物のある生活用品に似ています.弱いリファレンスとソフトリファレンスの違いは、弱いリファレンスのみを持つオブジェクトがより短いライフサイクルを持つことです.ごみ捨てスレッドが管理するメモリ領域をスキャンする過程で、現在のメモリ領域が十分であるかどうかにかかわらず、弱い参照のみを持つオブジェクトが発見されると、メモリが回収されます.ただし、ゴミ回収器は優先度の低いスレッドであるため、弱い参照のみを持つオブジェクトをすぐに発見するとは限らない.弱いリファレンスはリファレンスキュー(ReferenceQueue)と連携して使用できます.弱いリファレンスがリファレンスしたオブジェクトがゴミ回収されると、Java仮想マシンはこの弱いリファレンスを関連付けられたリファレンスキューに追加します.
public static void main(String[] args) {
   String str = new String("JAVA  ");
//   String str = "JAVA  ";           
   //             str  
   WeakReference<String> wr = new WeakReference<String> (str);
   str =null;
   //  
   System.out.println(wr.get());//JAVA  
   //      
   System.gc();
   System.out.println(wr.get());//null
 }
 //            。                  。

4.ダミーリファレンス(PhantomReference)
「虚引用」はその名の通り、形が虚構であり、他のいくつかの引用とは異なり、虚引用はオブジェクトのライフサイクルを決定しません.オブジェクトがダミー参照のみを持っている場合は、参照がない場合と同様に、いつでもゴミに回収される可能性があります.
ダミーリファレンスは、主にオブジェクトがゴミ回収されたアクティビティを追跡するために使用されます.ダミーリファレンスとソフトリファレンスと弱リファレンスの違いは、ダミーリファレンスがリファレンスキュー(ReferenceQueue)と組み合わせて使用される必要があることです.ゴミ回収器がオブジェクトを回収する準備をしている場合、ダミーリファレンスがあることが判明すると、オブジェクトのメモリを回収する前に、このダミーリファレンスを関連するリファレンスキューに追加します.プログラムは,参照キューに虚参照が加わったか否かを判断することで理解できる.
参照されたオブジェクトがゴミ回収されるかどうか.プログラムは、仮想リファレンスがリファレンスキューに追加されていることを発見した場合、リファレンスされたオブジェクトのメモリが回収される前に必要な行動をとることができます.
public static void main(String[] args){
  //       
  String str = new String("JAVA  ");
//          
  ReferenceQueue<String> rq = new ReferenceQueue<String>();
  //       ,      .              
  PhantomReference pr = new PhantomReference(str,rq);
  //     
  str =null;
  //         
  System.out.println(pr.get()); 
  //    
  System.gc();
  System.runFinalization();
  //                 pr    
  System.out.println(rq.poll()==pr);
 }
 //null
 //true
 //          ,                   ,           ,                  。