Java中的finalize方法理解,javafinalize理解

來源:互聯網
上載者:User

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方法

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.