1. 程式人生 > >JVM-如何判斷物件存活與否與CMS收集器和G1收集器的區別

JVM-如何判斷物件存活與否與CMS收集器和G1收集器的區別

JVM如何判斷物件存活?

1、計數器

2、可達性分析   (很多主流語言採用這種方法來判斷物件是否存活)

 

計數器:每當有一個地方引用該物件時,計數器 +1;引用失效則 -1;

優點:實現簡單,判定效率高。

缺點:難解決物件間的相互迴圈引用問題。

 

可達性分析:通過GC Roots的物件作作為起點,從這些起點向下去搜索,所走過的路徑叫做引用鏈,當一個物件到GC Roots沒有任何引用鏈連線時,則證明此物件不可達。

  簡單理解:1、物件A中引用了物件B,那麼就稱A到B可達。

       2、經歷兩次標記和篩選,第一次的標記和篩選並不能直接斷定物件的死亡。等第二次確認沒有可達的物件的時候才會真正確定。

  可作為 GC Root 的物件有
      1.Java虛擬機器棧(棧幀的本地變量表)中引用的物件
      2.本地方法棧 中 JNI引用物件
      3.方法區 中常量、類靜態屬性引用的物件

 

CMS收集器和G1收集器的區別

  CMS收集器:一款以獲取最短回收停頓時間為目標的收集器,是基於“標記-清除”演算法實現的,分為4個步驟:初始標記、併發標記、重新標記、併發清除。
  G1收集器:面向服務端應用的垃圾收集器,過程:初始標記;併發標記;最終標記;篩選回收。

 

 CMS特點併發,低停頓

   缺點對CPU非常敏感,無法處理浮動垃圾,記憶體碎片過多時,會產生full gc

        (什麼是浮動垃圾:併發清理階段使用者執行緒還在執行,這段時間就可能產生新的垃圾,新的垃圾在此次GC無法清除,只能等到下次清理)

  G1特點: 是一款面向服務端應用的垃圾收集器,並行於併發,分代收集,空間整合,可預測的停頓   

        (空間整合:由於G1使用了獨立區域(Region)概念,G1從整體來看是基於“標記-整理”演算法實現收集,從區域性(兩個Region)上來看是基於“複製”演算法實現的,但無論如何,這兩種演算法都意味著G1運作期間不會產生記憶體空間碎片。

           可預測的停頓:這是G1相對於CMS的另一大優勢,降低停頓時間是G1和CMS共同的關注點,但G1除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用這明確指定一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒)

 

   缺點:我暫時沒在網上找到相關資料