首頁 > Java > java教程 > JVM高階特性-三、垃圾收集之判斷物件存活演算法

JVM高階特性-三、垃圾收集之判斷物件存活演算法

巴扎黑
發布: 2017-06-26 11:34:11
原創
1551 人瀏覽過

一、概述​​

  運行時資料區中,程式計數器、虛擬機器棧、本地方法棧都是隨執行緒而生隨執行緒而滅的

  因此,他們的記憶體分配和回收是確定的,在方法或執行緒結束時就回收。而Java堆和方

  法區則是不確定的,程式運作過程中建立物件的大小是不定的,只有在程式處於執行

  期才能知道所需記憶體的大小

 

二、「存活演算法」

#  要判斷物件是否存活,主要有兩種演算法:引用計數法與可達性分析演算法

  • 引用計數法

    引用計數法就是為物件加上一個引用計數器,每當物件被引用一次

  計數器值就加1,引用時效則減1,計數器為0則表示不會再被使用。

 

  • 可達性分析演算法

    可達性分析演算法是主流的實現,這個演算法透過成為GC ROOT的節點作為根節點,

  從此根節點向下搜索,若物件到GC ROOT沒有引用鏈相連(即不可達)時,表示該

物件不可用

    可作為GC ROOT的物件為:


    • #虛擬機棧中本地變數表裡的引用物件

    • 方法去中的類別靜態屬性引用獨享

    • 方法去中的敞亮物件

    • 本機方法中的參考物件


    #  目前可達性分析演算法已是主流演算法,原因是,引用計數器演算法無法解決物件互相引用的問題

    • 可達性分析判斷過程

       對物件進行可達性分析之後,發現他沒有任何引用鏈相連,則對他進行第一次標記,並進行一次篩選,

       篩選條件是是否需要執行finalize()方法,當物件沒有覆寫finalize方法或已經finalize方法已經被呼叫過,

    #   則認為沒有必要執行,如果判斷為有必要執行,則會將他放入一個叫做F-Queue的佇列中,稍後JVM

    #   會自動建立一個低優先權的finalizer執行緒去執行這些物件的finalize方法,之後GC會對F-QUEUE中的對

       象進行第二次標記,如果此時物件丟沒逃脫,則將被回收。

    •  finalize()方法

    #   上面多次提到finalize方法,要注意,物件的finalize方法只會被系統自動呼叫一次。

       不建議大家使用這個方法,他的功能完成可以用try-finally取代

     

       

        

    ##

    以上是JVM高階特性-三、垃圾收集之判斷物件存活演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:php.cn
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    最新問題
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板