天天看點

Java 強應用、弱引用、軟引用、虛引用

Java 強應用、弱引用、軟引用、虛引用

今天無意中看到了這四個名詞,然後在腦海裡過了一下,發現已經忘得一幹二淨了,是以寫篇文章記錄一下,俗話說好記性不如爛筆頭。

那麼先來解釋下這4個名詞吧

強引用(StrongReference):

強引用就是我們平常new的一個對象

Object a = new Object();
           

當記憶體空間不足的時候,java虛拟機甯願抛出OOM異常,使程式異常終止,也不會靠随意回收有強引用的 對象來解決記憶體不足的問題,如果這個對象用完不用的時候可以通過 a = null;的這種方式來淡化引用;作用是幫助 垃圾收集器回收此對象;通過這種顯示的方式設定a為null,gc會認為該對象不存在引用,這個時候gc就可以回收這個對象。

軟引用(SoftReference):

如果一個對象隻有軟引用,并且記憶體足夠的時候, 垃圾回收期就不會回收它;如果記憶體不足了,就會被回收這些對象的記憶體;主要垃圾回收期沒有回收,該對象就可以一直被被程式使用。軟引用可以被用來實作記憶體敏感的高速緩存。

public class SoftReferenceTest {
    static class HeadObject{
        byte[] bs = new byte[1024 * 1024];
    }

    public static void main(String[] args) {
        SoftReference<HeadObject> softReference = new SoftReference<HeadObject>(new HeadObject());
        List<HeadObject> list = new ArrayList<>();
        while(true){
            if(softReference.get()!= null){
                list.add(new HeadObject());
                System.out.println("list-add");
            }else{
                System.out.println("----軟引用被回收");
                break;
            }
            System.gc();
        }
    }
}
           

這段程式代碼最後的結果是n多個list-add,最後是—軟引用被回收

弱引用(WeakReference):

弱引用與軟引用的差別在于:隻具有弱引用的對象的生命周期更短。在垃圾收集器線程掃描它所管轄的記憶體區域的過程中,一旦發現了隻具有弱引用的對象,不管記憶體足夠還是不足,都會進行回收。由于 垃圾回收期的線程比較低,一次不一定會很快發現那些具有弱引用的對象

public static void main(String[] args) throws InterruptedException {
        WeakReference<TestObj> weakReference = new WeakReference(new TestObj());
        System.out.println(weakReference.get() == null);
        System.gc();
        Thread.sleep(1000);
        System.out.println(weakReference.get() == null);
    }
           

讓代碼睡眠了1秒,gc之前的結果為true,gc之後的結果為false

虛引用(WeakReference):

虛引用:顧名思義,比較虛,就是形同虛設,又稱為幻影引用,與其他幾種都不同,虛引用不會決定對象的生命周期。如果一個對象僅是虛引用,那麼他就和沒有任何引用一樣,在任何時候都可能被回收。

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

總結:

四中引用的級别由高到低為:

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

在網上看到了比較通俗易懂的話來描述這四個引用:

  • 強引用:就像是老闆(OOM)的親兒子一樣,在公司可以什麼事都不幹,但是千萬不要老是占用公司的資源為他自己做事,記得用完公司的妹子之後,要讓她們去工作(資源要懂得釋放) 不然公司很可能會垮掉的。
  • 軟引用:有點像老闆(OOM)的親戚,在公司表現不好有可能會被開除,即使你投訴他(調用GC)上班看片,但是隻要不被老闆看到(被JVM檢測到)就不會被開除(被虛拟機回收)。
  • 弱引用:就是一個普通的員工,平常如果表現不佳會被開除(對象沒有其他引用的情況下),遇到别人投訴(調用GC)上班看片,那開除是肯定了(被虛拟機回收)。
  • 虛引用:這貨估計就是個實習生跟臨時工把,遇到事情的時候想到了你,沒有事情的時候,秒秒鐘拿出去頂鍋,開除。