Q:Java有幾種引用類型?

Java有幾種引用類型

引自 java 知識 之 內(nèi)存管理

Java 中的內(nèi)存管理包括內(nèi)存分配和內(nèi)存回收,這些都是由 JVM 幫我們完成的。當創(chuàng)建對象時為其分配內(nèi)存空間;當失去引用時,GC會自動清除并回收他們所占用的空間。

當一個對象在堆內(nèi)存中運行時,根據(jù)它對應的有向圖的狀態(tài),有如下三種狀態(tài):

  • 可達狀態(tài) 當一個對象被創(chuàng)建后,有一個以上的引用變量引用他,在有向圖中可以從起點導航到該點,此時可以通過引用變量調(diào)用它的屬性和方法。
  • 可恢復狀態(tài) 程序中不再有任何對象引用變量引用它,此時不能從有向圖的起點到達它。系統(tǒng)準備回收,再回收之前系統(tǒng)會調(diào)用該對象的finalize()方法進行資源清理,如果在finalize 中重新讓一個及以上的引用變量引用該對象,則它會再次變?yōu)榭蛇_狀態(tài),否則,進入不可達狀態(tài)。
  • 不可達狀態(tài) 所有的關聯(lián)都被切斷,永久性的失去引用,只有在該狀態(tài)下系統(tǒng)才會真正的回收對象所占用的資源。

三張狀態(tài)轉換圖如下:

對象狀態(tài)

強引用

在Java 中,創(chuàng)建一個對象,并把它賦值給一個引用變量,就是強引用。被強引用所引用的對象時絕對不會被垃圾回收機制回收的,即使系統(tǒng)非常緊張,因此它是造成內(nèi)存泄露的主要原因之一。

軟引用

軟引用需要用SoftReference類來實現(xiàn),當一個對象只有軟引用時,它有可能被回收。對于軟引用,當系統(tǒng)內(nèi)存空間足夠時,不會被回收,否則會被系統(tǒng)回收,該對象不可再被使用。

Xmx:設置java虛擬機堆內(nèi)存最大容量;
Xms:設置java虛擬機初始容量。

弱引用

弱引用于軟引用類似,但他的生存期更短,通過WeakReference類實現(xiàn)。對于只有弱引用的對象,當垃圾機制運行時,不管內(nèi)存是否足夠,總會回收該對象占用的內(nèi)存。

弱引用

虛引用

虛引用主要是跟蹤對象被垃圾回收的狀態(tài),可以通過檢查與虛引用關聯(lián)的隊列中是否包含指定的引用,了解對象是否被回收。
與軟引用和弱引用不同,虛引用不能單獨使用。
虛引用對象在被釋放前會將它添加到他關聯(lián)的引用隊列中。通過PhantomReference類實現(xiàn),結合引用隊列ReferenceQuence使用。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容