1. 程式人生 > >java 強引用,弱引用,軟引用

java 強引用,弱引用,軟引用

1.java記憶體管理分為記憶體分配和記憶體回收,都不需要程式設計師負責。

2.垃圾回收的機制主要是看物件是否有引用指向該物件。
  java物件的引用包括
  強引用
  軟引用
  弱引用
  虛引用

3.強引用
  是指建立一個物件並把這個物件賦給一個引用變數。
  強引用有引用變數指向時永遠不會被垃圾回收。即使記憶體不足的時候。
4.軟引用
  軟引用通過SoftReference類來實現

  軟引用的物件當系統記憶體充足時和強引用沒有太多區別,但記憶體不足時會回收軟引用的物件。

  很多物件,但是隻有一個引用指向他們(可分別指定)

   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());
 }
 

    當系統記憶體充足時,系統不會進行軟引用的記憶體回收,
    當系統不足時將會回收軟引用的物件。

    當用 java -Xmx1m -Xms1m SoftReferenceTest 命令時強制堆記憶體為1m時 軟引用引用物件
    將被回收。(可以建立10000個物件)

 
5.weakReference
    弱引用通過weakReference類來實現

    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
 }

 弱引用具有很強的不確定性。因為垃圾回收每次都會回收弱引用的物件。

6.虛引用
   軟引用和弱引用可以單獨使用,虛引用不能單獨使用,需引用的作用是就跟蹤物件被垃圾回收的
   狀態,程式可以通過檢測與虛引用關聯的虛引用佇列是否已經包含了指定的虛引用,從而瞭解
   虛引用的物件是否即將被回收。
   PhantomReference物件實現

   虛引用通過PhantomRefence類實現,它本身對物件沒有影響,類似與沒有應用,物件甚至感覺不到
   虛引用的存在,如果一個物件只有一個虛引用存在,那麼他就類似沒有應用存在。

    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
    當程式強制垃圾回收後,只有虛引用引用字串物件將會被垃圾回收,當被引用的物件被回收後,
    對應的引用將被新增到關聯的引用佇列中。

  7.如果使用軟引用,弱引用,虛引用的引用方式引用物件,垃圾回收就能夠隨意的釋放這些物件,
    若果希望儘可能減小程式在起宣告週期中所佔用的記憶體大小,可以靈活使用這些引用。

    如果使用了這些引用就不能保留這些物件的強引用(強制引用應該置null),否則就浪費了這些類提供的任何好處。