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

鋈巍醭觶發表於2020-09-29

強引用

強引用是無論在任何情況下,只要強引用關係還存在,即使垃圾收集器進行垃圾回收,甚至丟擲OOM,也不會回收掉被引用的物件,如下程式碼片段:

Object obj = new Object();

軟引用

軟引用是用來描述一些還有用,但非必須的物件。只被軟引用關聯著的物件,若JVM記憶體足夠時,即使觸發垃圾回收也不會回收該物件;但當JVM記憶體不夠時,系統在發生OOM之前,就會對這些物件進行回收,若回收之後,還是沒有足夠的空間時,才會丟擲OOM。下面我們用示例程式碼來說明:

/**
 * 軟引用
 * <p>
 * -Xmx10M -Xms10M -XX:+PrintGCDetails
 */
public class SoftTest {

    public static void main(String[] args) throws Exception {
        SoftReference<Soft> soft = new SoftReference<>(new Soft());
        System.out.println("手動觸發gc前:" + soft.get());
        // 手動觸發一次gc
        System.gc();
        // 睡眠1秒鐘,等待手動觸發gc能夠成功
        TimeUnit.SECONDS.sleep(1);
        System.out.println("手動觸發gc後:" + soft.get());
        // 再嘗試建立一個強引用物件,分配5M記憶體
        // 因為我們堆空間最大10M記憶體,會出現Full GC
        Soft soft1 = new Soft();
        System.out.println("jvm記憶體不足後:" + soft.get());
    }
}

class Soft {
    // 申請一個5M記憶體的陣列
    private byte[] filed = new byte[1024 * 1024 * 5];
}

執行上面的程式碼,並設定執行時引數:-Xmx10M -Xms10M -XX:+PrintGCDetails,執行結果如下圖所示:
soft
從執行結果來看,在jvm記憶體足夠時,即使手動觸發一次GC,被軟引用的物件沒有被回收,但是一旦記憶體不足觸發GC後,只被軟引用著的物件會被回收。

弱引用

弱引用也是用來描述那些非必須的物件,它比軟引用的強度更弱一些,被弱引用關聯的物件只能生存到下一次垃圾收集器發生為止,即只要垃圾收集器開始工作,無論jvm記憶體是否充足,都會回收掉只被弱引用關聯的物件。下面我們用如下程式碼示例說明:

/**
 * 弱引用
 * <p>
 * -XX:+PrintGCDetails
 */
public class WeakTest {
    public static void main(String[] args) throws Exception {
        WeakReference<Weak> weak = new WeakReference<>(new Weak());
        System.out.println("手動觸發gc前:" + weak.get());
        // 手動觸發一次gc
        System.gc();
        // 睡眠1秒鐘,等待手動觸發gc能夠成功
        TimeUnit.SECONDS.sleep(1);
        System.out.println("手動觸發gc後:" + weak.get());
    }
}

class Weak {
}

執行上面的程式碼,並設定執行時引數:-XX:+PrintGCDetails,執行結果如下圖所示:
在這裡插入圖片描述

虛引用

虛引用是一種最弱的引用關係,一個物件是否存在虛引用,完全不會對其生存時間構成任何影響,也無法通過虛引用來取得一個物件的例項。為一個物件設定虛引用關聯的唯一目的只是為了能在這個物件被收集器回收時收到一個系統通知,我們可以檢視JDK定義的PhantomReference類,從類中可以看到,建立虛引用時,必須與一個引用佇列進行關聯,程式碼如下:
在這裡插入圖片描述

總結

最後做一個總結:
強引用:JVM即使記憶體不足時,丟擲OOM,也不會回收掉強引用關聯的物件;
軟引用:JVM即使記憶體不足時,才會回收掉軟引用關聯的物件;
弱引用:垃圾收集器工作時,無論記憶體是否足夠,都會回收掉弱引用關聯的物件;
虛引用:不會影響虛引用關聯物件的生存時間。

相關文章