java如何判斷一個對象是否存活

1. 引用計數法

引用計數器法:每個對象設置一個引用計數器,當對象被引用,計算器加1,當引用失效,計算器減一。當計數器爲0時,
表示引用失效,也就是"死對象",可以被垃圾回收機制回收。
缺陷:無法解決循環依賴的問題。有兩個對象A、B。當A引用B,B引用A時,那麼此時A、B對象都不爲0,垃圾回收機
制無法被回收。

2. 可達性算法(引用鏈法)

從GCRoot開始向下搜索,如果一個對象沒有與任何引用鏈相連時,表示這個對象是垃圾對象,
可以被垃圾回收機制回收。
GC Roots的對象:
虛擬機棧中的引用對象
方法區類靜態引用對象
方法區常量池引用對象
本地方法棧JNI引用的對象

注意:雖然算法可以判斷一個對象是否是垃圾對象,但是並不是垃圾對象就可以被回收的。當一個對象不可達GC Root時,這個對象並不會立馬被回收,而是出於一個死緩的階段,若要被真正的回收需要經歷兩次標記。如果對象在可達性分析中沒有與GC Root的引用鏈,那麼此時就會被第一次標記並且進行一次篩選,篩選的條件是是否有必要執行finalize()方法。當對象沒有覆蓋finalize()方法或者已被虛擬機調用過,那麼就認爲是沒必要的。
如果該對象有必要執行finalize()方法,那麼這個對象將會放在一個稱爲F-Queue的對隊列中,虛擬機會觸發一個Finalize()線程去執行,此線程是低優先級的,並且虛擬機不會承諾一直等待它運行完,這是因爲如果finalize()執行緩慢或者發生了死鎖,那麼就會造成F-Queue隊列一直等待,造成了內存回收系統的崩潰。GC對處於F-Queue中的對象進行第二次被標記,這時,該對象將被移除”即將回收”集合,等待回收。

觸發垃圾回收機制的條件

在正常情況下是不會執行的,只有在虛擬機空閒或者當前堆內存不足時,纔會觸發執行,掃面那些沒有被任何引用的對象,並將它們添加到要回收的集合中,進行回收。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章