Java有幾種引用類型
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使用。