首頁  >  文章  >  Java  >  Java四種引用類型的具體介紹

Java四種引用類型的具體介紹

黄舟
黄舟原創
2017-03-18 13:56:512080瀏覽

紙上得來終覺淺,絕知此事要躬行 --陸遊   問渠那得清如許,為有源頭活水來 --朱熹

Java從1.2版本開始引入了4種引用,這四種引用的等級由高到低依序為:強引用>軟引用>弱引用>虛引用

一、強引用(StrongReference):

        強引用是使用最普遍的引用,一般我們將物件初始化之後就是一個強引用。 當一個物件具有強烈引用時,JVM不會對它進行垃圾回收。當記憶體不足時,寧願拋出OutofMemoryError,讓程式異常終止,也不會回收強引用。

二、軟引用(SoftReference):

        如果一個物件是弱引用,如果記憶體足夠就不會對它進行垃圾回收;如果記憶體空間不足了,就會回收這部分物件。只要垃圾回收器沒有對它進行回收,那麼程式就可以使用它。軟引用可用於實現記憶體敏感的高速緩存。軟引用可以和一個引用隊列(ReferenceQueue)結合使用,如果軟引用所引用的物件被垃圾回收器回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。

三、弱引用(WeakReference):

#        弱引用和軟引用的差異在於弱引用擁有更短的生命週期。當垃圾回收器掃描記憶體區域時,只要發現弱引用就會對它進行回收。但由於垃圾回收器是優先順序比較低的線程,因此不一定很快就會發現那些弱引用物件。弱引用可以和一個引用隊列(ReferenceQueue)結合使用,如果弱引用所引用的物件被垃圾回收,Java虛擬機器就會把這個弱引用加入到與之關聯的引用隊列中。

四、虛引用(PhantomReference):

        與其他幾種引用都不同,虛引用並不會決定物件的生命週期。如果一個物件只持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。 虛引用主要用來追蹤物件被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個物件時,如果發現它還有虛引用,就會在回收物件的記憶體之前,把這個虛引用加入到與之 關聯的引用佇列中。

範例程式碼:

強引用:

public class MyClass
{
    MyClass()
    {

    }
}public class Test
{    public static void main(String [] args)
    {
        MyClass myClass=new MyClass();        System.gc();    }
}

明確的呼叫了垃圾回收,但由於myClass是強引用,myClass沒有被回收。

軟體引用:

public class MyClass
{
    MyClass()
    {

    }
}public class Test
{    public static void main(String [] args)
    {
        MyClass myClass=new MyClass();        SoftReference ref=new SoftReference(myClass);        System.gc();    }
}

記憶體不足時軟引用被回收。

弱引用:

public class MyClass
{
    MyClass()
    {

    }
}public class Test
{    public static void main(String [] args)
    {
        MyClass myClass=new MyClass();        WeakReference ref=new WeakReference(myClass);        System.gc();    }
}

當JVM垃圾回收時,弱引用就會被回收。

虛引用:

public class MyClass
{
    MyClass()
    {

    }
}public class Test
{    public static void main(String [] args)
    {
        MyClass myClass=new MyClass();        
        ReferenceQueue rq=new ReferenceQueue();        
        PhantomReference pr=new PhantomReference(myClass,rq);        
        System.gc();    
        }
}

虛引用,被實例化之後就會被回收。

總結:

什麼時候被垃圾回收使用生存時間

#等級

##強引用

從來不會

物件的一般狀態
JVM停止執行階段終止

#軟體引用

在記憶體不足時############物件簡單?快取############記憶體不足時終止#####################弱引用########## #####在垃圾回收時############物件快取###

gc運行後終止

#虛引用

Unknown

Unknown

#Unknown

 

相關文章:

詳細比較Java中的基本類型變數和引用類型變數

#解析java中的引用類型的概念

JavaScript 基本資料型別與引用型別的差異詳解

以上是Java四種引用類型的具體介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn