1. 程式人生 > >jvm原理四:利用可達性分析演算法GC怎麼判斷物件生存還是死亡,經過了幾次過濾,每次都做了什麼

jvm原理四:利用可達性分析演算法GC怎麼判斷物件生存還是死亡,經過了幾次過濾,每次都做了什麼

經歷了2次標記過程,即2次過濾過程。

第一次:如果物件在進行可達性分析後發現沒有GC Roots相連線的引用鏈,那它將會被第一次標記並且進行一次篩選,篩選的條件是此物件是否有必要執行finalize()方法,當物件沒有覆蓋finalize()方法,或者finalize()方法已經被虛擬機器呼叫過,虛擬機器將這兩種情況都視為沒有必要執行。如果這個物件被判定為有必要執行finalize()方法,那麼這個物件將會被放置一個叫做F-Queue的佇列之中,並在稍後由一個由虛擬機器自動建立的、低優先順序的Finalizer執行緒去執行它。

第二次:GC將會對F-Queue中的物件進行第二次小規模的標記,如果物件要在

finalize()中成功拯救自己——只要重新與引用鏈上的任何一個物件建立關聯即可,如果物件這個時候還沒有逃脫,那基本上它就真的被回收了。

finalize()方法:每個物件的finalize方法只會執行一次。