Gc如何判斷對象可以被回收?


 

      Gc如何判斷對象可以被回收?

 

      1 引用計數器:每一個對象有一個引用屬性,新增一個引用時加一,引用釋放時減一,計數為0的時候可以回收。

      2 可達性分析:從GcRoot開始向下搜索,搜索所走過的路徑被稱為引用鏈,當一個對象到GcRoot沒有任何引用鏈相連時,則證明此對象是不可用的,那么虛擬機就可以判定回收。

      

  

 

      什么是GcRoot?

      GcRoot 的對象有:

      1 虛擬機棧中引用的對象

      2 方法區中靜態屬性引用的對象。

      3 方法區中常量引用的對象

      4 本地方法棧中(即一般說的native方法)引用的對象

      

 

      可達性算法中的不可達對象並不是立即死亡的,對象擁有一次自我拯救的機會,對象被系統宣告

死亡至少要經理兩次標記過程,第一次是經過可達性分析發現沒有與GcRoots 相連接的引用鏈,第二次是由

虛擬機自動簡歷的Finalizer隊列中判斷是否需要執行finalize()方法。

      當對象變成GcRoot不可達時,Gc會判斷該對象是否覆蓋了finalize方法,若未覆蓋,則直接回收,

否則,若對象未執行過finalize方法,將其放入F-Queue隊列,由一低優先級線程執行該隊列中對象的finalize方法。

執行每個對象只能觸發一次的finalize方法。

      由於finalize方法運行代價高昂,不確定性大,無法保證各個對象調用順序,不推薦使用。

 

 

 

 

 

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM