紙上得來終覺淺,絕知此事要躬行 --陸遊問渠那得清如許,為有源頭活水來 --朱熹
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四種引用類型的具體介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!