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毫秒)
缺點:我暫時沒在網上找到相關資料