一旦垃圾回收器准備好釋放對象占用的存儲空間,將首先調用其finalize()方法(如果覆蓋了finalize()方法),並且在下一次垃圾回收器發生時,才會真正回收對象占用的內存。
至於為什么在下一次垃圾回收動作發生時才會回收內存,原因是如果一個對象覆蓋了 finalize() 方法,那么在真正被宣告死亡的時候,至少需要經過兩次標記。第一次被標記的時候會被放在 一個 F-Queue 隊列中,finalize() 方法是對象逃脫死亡命運的最后一次機會。在第二次標記的時候,如果該對象成功與引用鏈(GC-Roots)上的任何一個對象關聯,那么它仍然可以存活下來,否則將會被垃圾收集器回收。