finalized的問題:
1、Java語言規範中不能保證finalize會及時執行,甚至不能保證其會被執行;
2、finalize可能會影響性能,JVM通常在單獨的低優先級線程中完成finalize的執行;
3、finalize有對象再生問題;
4、finalize最多由gc執行一次。
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可以安全的回收該對象的記憶體了。