天天看點

四大引用——強引用、軟引用、弱引用、虛引用

強引用、軟引用、弱引用、虛引用

  • ​​強引用​​
  • ​​軟引用​​
  • ​​弱引用​​
  • ​​虛引用​​

在JDK 1.2之後,Java對引用的概念進行了擴充,将引用分為強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)四種,這四種引用強度依次逐漸減弱。

強引用

就是指在程式代碼之中普遍存在的,類似​

​Object obj=new Object()​

​這類的引用,​隻要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象​。

軟引用

用來描述一些還有用,但并非必需的對象。**對于軟引用關聯着的對象,在系統将要發生記憶體溢出異常之前,将會把這些對象列進回收範圍之中并進行第二次回收。**如果這次回收還是沒有足夠的記憶體,才會抛出記憶體溢出異常。在JDK 1.2之後,提供了​

​SoftReference​

​類來實作軟引用。

弱引用

也是用來描述非必需對象的,但是它的強度比軟引用更弱一些,隻被弱引用關聯的對象隻能生存到下一次垃圾收集發生之前。當垃圾收集器工作時,**無論目前記憶體是否足夠,都會回收掉隻被弱引用關聯的對象,如果還有被其他強引用關聯則不回收。**在JDK 1.2之後,提供了​

​WeakReference​

​類來實作弱引用。

舉例驗證:

public class Test2217 {
    public static void main(String[] args) throws InterruptedException {
        ReferenceQueue<String> referenceQueue = new ReferenceQueue<String>();
        // 直接傳字元串,該字元串并不是在堆中配置設定記憶體,是以有強引用
//        WeakReference<String> weakReference = new WeakReference<String>("徐同學呀", referenceQueue);
        WeakReference<String> weakReference = new WeakReference<String>(new String("徐同學呀"), referenceQueue);
        System.out.println(weakReference);
        // 有強引用,也不會回收
//        String key = weakReference.get();
        System.out.println("gc 前:" + weakReference.get());
        System.gc();
        Thread.sleep(2000);
        System.out.println("gc 後:" + weakReference.get());
        // ReferenceQueue 是 gc時 會把回收的WeakReference添加進,真實回收的是
        // WeakReference裡的内容
        System.out.println(referenceQueue.poll());
    }
}

java.lang.ref.WeakReference@533ddba
gc 前:徐同學呀
gc 後:null
java.lang.ref.WeakReference@533ddba      

虛引用

也稱為幽靈引用或者幻影引用,它是最弱的一種引用關系。​一個對象是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象執行個體​。為一個對象設定虛引用關聯的唯一目的就是​希望能在這個對象被收集器回收時收到一個系統通知​。在JDK 1.2之後,提供了​

​PhantomReference​

​類來實作虛引用。