Java中的finalize方法理解,javafinalize理解
首先:system.gc()並不是你調用就馬上執行的, 而是根據虛擬機器的各種演算法來來計算出執行記憶體回收的時間,另外,程式自動結束時不會執行記憶體回收的。
其次:對象被回收時,要經過兩次標記,第一次標記,如果finalize被重寫,或者finalize被調用過,那麼記憶體回收並不會去執行finalize,第二次標記,如果對象不能在finalize中成功拯救自己,那真的就要被回收了。
咱們用的虛擬機器一般都是sun的hotspot,以下描述都是針對hotspot虛擬機器,當然其他虛擬機器也差不多,
,,他是根據跟搜尋演算法判斷哪些垃圾需要回收
GCROOT就是跟,,記憶體回收又分為新生代和老生代,你剛new的對象,佔用的記憶體也不會超過
直接進入老生代的標準,,因為可以存活下來的對象很少,,,所以新生代採用複製的演算法,,
如果你的對象執行個體沒有到達這個跟的引用鏈,,那麼就會被標記為要回收的對象,新生代的記憶體
模型分為eden space和s0以及s1,,被標記為要清除的對象後,會進行篩選,如果這個對象沒被調用過
finalize方法並且重寫了finalize方法,,那麼就會把這個對象加入一個叫F-queue的隊列中,然後
虛擬機器會啟動一個優先順序較低的finalizer線程去執行這個對象的finalize方法,如果在這些方法結束之前
這個對象又有了一個引用鏈到達gc root 那麼 這個對象這次就是自救成功了, 垃圾收集器不會手收集他,,
當然同一個對象執行個體的finalize方法只會被調用一次,也就是說只有一次自救機會。
所以被調用有三種情況
1. 對象失效後,被立刻回收,此時finalize方法被調用。
2. 在E、S0、S1或者O區中的時候,所處堆區達到100%,該區已經失效的所有對象被回收,會觸發finalize方法。
3. P區達到100%,jvm中斷當前所有進程,回收所有已經失效的對象,觸發finalize方法
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。