天天看點

java finalize方法的問題及執行過程

finalized的問題:

1、Java語言規範中不能保證finalize會及時執行,甚至不能保證其會被執行;

2、finalize可能會影響性能,JVM通常在單獨的低優先級線程中完成finalize的執行;

3、finalize有對象再生問題;

4、finalize最多由gc執行一次。

finalize的執行過程(對象再生的過程解析)

java finalize方法的問題及執行過程

1、首先,對象是由reachable+unfinalized的狀态走向死亡的;

2、引用關系消失導緻對象狀态改變,對象由reachable狀态轉為f-reachable或unreachable狀态;

3、當對象變為非reachable+unfinalized狀态時,GC會将其放入f-queue中,此時對象狀态變為f-reachable+finalizable;

4、當對象被GC從f-queue中取出,将其标記為finalized并執行finalize方法時,一旦有活動線程引用該對象,那麼該對象的狀态就變為reachable+finalized,此時該對象就重新存活;

5、因為任何對象的finalize至多執行一次,是以一旦對象狀态變為finalized,就不會再被放入f-queue中,finalize方法就不會被執行;

注意:

1、若對象的finalize方法沒有被重寫或者重寫了沒做任何操作,為了性能,該對象會直接被回收,不會放入f-queue中;

2、若對象為unreachable+finalized,該對象離真正的死亡不遠了。GC可以安全的回收該對象的記憶體了。