<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      skywang12345

      導航

       

      Java引用總結--StrongReference、SoftReference、WeakReference、PhantomReference

       

       


      1 Java引用介紹

         Java從1.2版本開始引入了4種引用,這4種引用的級別由高到低依次為:

         強引用  >  軟引用  >  弱引用  >  虛引用

      ⑴強引用(StrongReference)
          強引用是使用最普遍的引用。如果一個對象具有強引用,那垃圾回收器絕不會回收它。當內存空間不足,Java虛擬機寧愿拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足的問題。

      ⑵軟引用(SoftReference)

          如果一個對象只具有軟引用,則內存空間足夠,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。

          軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被垃圾回收器回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。

      ⑶弱引用(WeakReference)

          弱引用與軟引用的區別在于:只具有弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由于垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。

          弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。

      ⑷虛引用(PhantomReference)

          “虛引用”顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用并不會決定對象的生命周期。如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。

          虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在于:虛引用必須和引用隊列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之 關聯的引用隊列中。

       

      由于引用和內存回收關系緊密。下面,先通過實例對內存回收有個認識;然后,進一步通過引用實例加深對引用的了解。

       

       

       


      2 內存回收

      創建公共類MyDate,它的作用是覆蓋finalize()函數:在finalize()中輸出打印信息,方便追蹤。

      說明:finalize()函數是在JVM回收內存時執行的,但JVM并不保證在回收內存時一定會調用finalize()。

      MyDate代碼如下:

      package com.skywang.java;
      
      import java.util.Date;
      
      public class MyDate extends Date { 
      
          /** Creates a new instance of MyDate */
          public MyDate() {
          }
          // 覆蓋finalize()方法
          protected void finalize() throws Throwable {
              super.finalize();
              System.out.println("obj [Date: " + this.getTime() + "] is gc");
          }   
      
          public String toString() {
              return "Date: " + this.getTime();
          }
      }

      在這個類中,對java.util.Date類進行了擴展,并重寫了finalize()和toString()方法。

       

      創建公共類ReferenceTest,它的作用是定義一個方法drainMemory():消耗大量內存,以此來引發JVM回收內存。

      ReferenceTest代碼如下:

      package com.skywang.java;
      
      public class ReferenceTest {   
          /** Creates a new instance of ReferenceTest */
          public ReferenceTest() {
          }   
          
          // 消耗大量內存
          public static void drainMemory() {
              String[] array = new String[1024 * 10];
              for(int i = 0; i < 1024 * 10; i++) {
                  for(int j = 'a'; j <= 'z'; j++) {
                      array[i] += (char)j;
                  }           
              }
          }
      } 

      在這個類中定義了一個靜態方法drainMemory(),此方法旨在消耗大量的內存,促使JVM運行垃圾回收。

       

      有了上面兩個公共類之后,我們即可測試JVM什么時候進行垃圾回收。下面分3種情況進行測試:

      情況1:清除對象

      實現代碼

      package com.skywang.java;
      
      public class NoGarbageRetrieve {
      
          public static void main(String[] args) {
              MyDate date = new MyDate();
              date = null;
          }
      }

      運行結果

      <無任何輸出>

      結果分析:date雖然設為null,但由于JVM沒有執行垃圾回收操作,MyDate的finalize()方法沒有被運行。

       

      情況2:顯式調用垃圾回收

      實現代碼 

      package com.skywang.java;
      
      public class ExplicitGarbageRetrieve {
      
          /**
           * @param args
           */
          public static void main(String[] args) {
              // TODO Auto-generated method stub
              MyDate date = new MyDate();
              date = null;
              System.gc();
          }
      
      }

      運行結果

      obj [Date: 1372137067328] is gc

      結果分析:調用了System.gc(),使JVM運行垃圾回收,MyDate的finalize()方法被運行。

       

      情況3:隱式調用垃圾回收

      實現代碼 

      package com.skywang.java;
      
      public class ImplicitGarbageRetrieve {
      
          /**
           * @param args
           */
          public static void main(String[] args) {
              // TODO Auto-generated method stub
              MyDate date = new MyDate();
              date = null;
              ReferenceTest.drainMemory();
          }
      
      } 

      運行結果

      obj [Date: 1372137171965] is gc

      結果分析:雖然沒有顯式調用垃圾回收方法System.gc(),但是由于運行了耗費大量內存的方法,觸發JVM進行垃圾回收。

       

      總結:JVM的垃圾回收機制,在內存充足的情況下,除非你顯式調用System.gc(),否則它不會進行垃圾回收;在內存不足的情況下,垃圾回收將自動運行

       

       

       


      3、Java對引用的分類

      3.1 強引用

      實例代碼

      package com.skywang.java;
      
      public class StrongReferenceTest {
      
          public static void main(String[] args) {
              MyDate date = new MyDate();
              System.gc();
          }
      }

      運行結果

      <無任何輸出>

      結果說明:即使顯式調用了垃圾回收,但是用于date是強引用,date沒有被回收。

       

      3.2 軟引用

      實例代碼

      package com.skywang.java;
      
      import java.lang.ref.SoftReference;
      
      public class SoftReferenceTest {
      
          public static void main(String[] args) {
              SoftReference ref = new SoftReference(new MyDate());
              ReferenceTest.drainMemory();
          }
      }

      運行結果

      <無任何輸出>

      結果說明:在內存不足時,軟引用被終止。軟引用被禁止時,

      SoftReference ref = new SoftReference(new MyDate());
      ReferenceTest.drainMemory();

      等價于

      MyDate date = new MyDate();

      // 由JVM決定運行
      If(JVM.內存不足()) {
      date = null;
      System.gc();
      }

       

      3.3 弱引用

      示例代碼 

      package com.skywang.java;
      
      import java.lang.ref.WeakReference;
      
      public class WeakReferenceTest {
      
          public static void main(String[] args) {
              WeakReference ref = new WeakReference(new MyDate());
              System.gc(); 
          }
      }

      運行結果

      obj [Date: 1372142034360] is gc

      結果說明:在JVM垃圾回收運行時,弱引用被終止.

      WeakReference ref = new WeakReference(new MyDate());
      System.gc();

      等同于:

      MyDate date = new MyDate();

      // 垃圾回收
      If(JVM.內存不足()) {
      date = null;
      System.gc();
      }

       

      3. 4 假象引用

      示例代碼 

      package com.skywang.java;
      
      import java.lang.ref.ReferenceQueue;
      import java.lang.ref.PhantomReference;
      
      public class PhantomReferenceTest {
      
          public static void main(String[] args) {
              ReferenceQueue queue = new ReferenceQueue();
              PhantomReference ref = new PhantomReference(new MyDate(), queue);
              System.gc();
          }
      }

      運行結果

      obj [Date: 1372142282558] is gc

      結果說明:假象引用,在實例化后,就被終止了。

      ReferenceQueue queue = new ReferenceQueue();
      PhantomReference ref = new PhantomReference(new MyDate(), queue);
      System.gc();

      等同于:

      MyDate date = new MyDate();
      date = null;

       

       

      可以用以下表格總結上面的內容: 

      級別

      什么時候被垃圾回收

      用途

      生存時間

      強引用

      從來不會

      對象的一般狀態

      JVM停止運行時終止

      軟引用

      在內存不足時

      對象簡單?緩存

      內存不足時終止

      弱引用

      在垃圾回收時

      對象緩存

      gc運行后終止

      虛引用

      Unknown

      Unknown

      Unknown

       

       

       


       

      點擊下載:源代碼

       

      posted on 2013-06-25 14:43  如果天空不死  閱讀(27822)  評論(9)    收藏  舉報
       
      主站蜘蛛池模板: 国产精品美女自慰喷水| 中文国产成人精品久久不卡| 亚洲日韩乱码中文无码蜜桃臀| 国产美女久久久亚洲综合 | 国产在线拍揄自揄拍无码视频| 97精品伊人久久久大香线蕉| 成人性影院| 免费人妻无码不卡中文字幕18禁| 无码日韩av一区二区三区| 色窝窝免费播放视频在线| 久热色精品在线观看视频| 国产成人无码专区| 亚洲精品一区二区在线播| 亚洲欧美中文日韩v在线97 | 国产av一区二区亚洲精品| 免费拍拍拍网站| 亚洲国产精品日韩av专区| 综合在线 亚洲 成人 欧美| 日本深夜福利在线观看| 国产美女精品一区二区三区| 亚洲成AV人片在线观高清| 免费午夜无码片在线观看影院| 办公室强奷漂亮少妇视频| 将乐县| 亚洲一区二区三区18禁| 最新精品露脸国产在线| 久久国产自拍一区二区三区| 亚洲精品乱码久久久久久蜜桃不卡| 一区二区在线观看 激情| 久久精品人妻无码专区| 亚洲综合精品中文字幕| 亚洲av无码精品蜜桃| 韩国免费a级毛片久久| 亚洲狠狠狠一区二区三区| 中国大陆高清aⅴ毛片| 国产精品亚洲五月天高清| 国产精品午夜福利视频234区| 一道本AV免费不卡播放| 99久久免费精品色老| 精品国产一区二区三区蜜臀| 台湾佬自拍偷区亚洲综合|