java中的四種引用-歸納

說起高新行業,java一直都是開發行業的大佬,但不得不說java確實是一個比較繁瑣的語言,這讓原本就十分枯燥的編程,變得更加離譜。今天說一下java的引用上的一些整理歸納。

內容是整理的github上yangengzhe這位技術大牛的文章。希望文章能對學習java的朋友帶來一些幫助。

java中的四種引用-歸納

java中的四種引用

從jdk1.2以後,為了更好的控制對象的生命週期,從而定義了四中級別:強引用、軟引用、弱引用和虛引用。不同的引用對於JVM的垃圾回收以及內存洩露等有著重要的影響。

java中的四種引用-歸納

強引用

正常的使用中,聲明的對象都是強引用,是最普遍的引用。強引用是不能被回收機制所回收的,即使達到一定程度之後,報出OutOfMemoryError異常也不會進行對象的回收

軟引用

當一個對象只有軟引用指向時,若內存不足時,垃圾回收器將進行回收;若內存足夠時,垃圾回收器將不會進行回收。,由於其這樣的特性,一般可以用來做緩存使用,當JVM需要內存時 才將這些軟引用的對象進行回收。

java.lang.ref.SoftReference 表示軟引用。具體代碼如下:

Counter prime = new Counter(); 
SoftReference soft = new SoftReference(prime) ;
prime = null;

1)創建強引用對象prime

2)創建軟引用對象soft,並指向對象prime

3)將強引用對象置空,此時當內存不足時,垃圾回收器將進行回收。(若不置空,將有強引用和軟引用同時指向 永遠不會進行回收)

弱引用

弱引用的生命週期比軟引用還要短,**當觸發垃圾回收機制時,無論內存是否滿足都將進行回收處理,這是一種急切回收方式。**一般非常適合存儲元數據,例如:存儲ClassLoader引用。或者需要存儲大量數據,而且在被回收後很容易再次加載的數據。

java.lang.ref.WeakReference 來創建弱引用。具體代碼如下:

Counter counter = new Counter(); 
WeakReference weakCounter = new WeakReference(counter);
counter = null;

1)創建強引用對象counter

2)創建弱引用對象weakCounter

3)將強引用對象置空,此時垃圾回收器發現該對象時將立即回收。

java中的四種引用-歸納

虛引用

虛引用,就是形同虛設,不影響對象的生命週期,一個對象持有虛引用和沒有引用的效果是一樣的。任何時候 都可能被垃圾回收機制所回收。和軟引用、弱引用的區別主要在於,必須與引用隊列聯合使用。主要用來跟蹤對象被垃圾回收的活動。

java.lang.ref.PhantomReference 來創建虛引用。具體代碼如下:

DigitalCounter digit = new DigitalCounter(); 
PhantomReference phantom = new PhantomReference(digit);
digit = null;

用途: 處理類似圖片的大文件的情況。當你確定一個圖片數據對象應該被回收,你可以利用虛引用來判斷這個對象回收之後在繼續加載下一張圖片。

引用隊列

軟引用、弱引用和虛引用可以使用引用隊列。**當該引用的對象被垃圾回收器標記為待回收時,便會加入到引用隊列中。**可以通過判斷對象是否在引用隊列中得知,對象是否將被回收,從而完成相關的刪除工作。

ReferenceQueue refQueue = new ReferenceQueue(); 	DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference
(digit, refQueue);

總結

強引用:永遠不會被垃圾回收器刪除。(垃圾回收器是回收不可達的對象,不可達代表沒有引用所指)

軟引用:內存不足時進行回收。可以做緩存用

弱引用:只要發現就進行回收。可以做緩存、存儲元數據、大數據等用

虛引用:和沒有引用一樣,必須與引用隊列一起使用。可以用於跟蹤對象是否被回收。

引用隊列:被回收器標記的對象,該引用則會加入引用隊列中。(只有軟引用、弱引用和虛引用可以使用)

—— yangengzhe


分享到:


相關文章: