垃圾收集器
新生代的收集器
- 串行收集器(Serial收集器)
- 單一線程工作
- Stop the world
- 用戶端模式預設收集器
- 簡單高效,新生代複制算法,老年代标記-整理算法
-
JVM-垃圾收集器-《深入了解Java虛拟機》學習筆記
- ParNew收集器
- 年輕代,多線程并行GC
- 對CPU的依賴性比較高
- 複制算法
-
JVM-垃圾收集器-《深入了解Java虛拟機》學習筆記
- Parallel Scavenge收集器
- 關注的側重點在吞吐量
- 自适應的調節政策
老年代的收集器
- Serial Old收集器
- 标記 整理
- CMS收集器發生失敗時的後備預案,在并發收集發生Concurren Mode Failure時使用
JVM-垃圾收集器-《深入了解Java虛拟機》學習筆記
- Parallel Old 收集器
- 标記整理算法
- 注重吞吐量或者處理器資源比較稀缺的場合
-
JVM-垃圾收集器-《深入了解Java虛拟機》學習筆記
- CMS收集器
- 采用标記-清除
- 最短回收停頓時間
- 并發收集,低停頓
- 對處理器資源要求比較高
- 無法處理 浮動垃圾
-
JVM-垃圾收集器-《深入了解Java虛拟機》學習筆記
要有初始标記,并發标記,重新标記和并發清除四個階段,就是說首先先标記GC root,然後向下搜尋和GC root關聯的對象,然後修改在并發标記期間因為标記狀态改變的,最後将需要回收的回收掉。
缺點就是對CPU太敏感,會産生浮動垃圾,而且會産生大量記憶體碎片。
- G1收集器
- 面向服務端應用
- 可預測停頓時間垃圾收集器
- 基于Region的堆記憶體布局
- 可以管理全堆記憶體
- 按收益動态确定回收集
- 也是分代理論,但記憶體中不在劃分新生代、老年代
- 四個步驟
- 出初始标記
- 并發标記
- 最終标記
- 篩選删除
-
JVM-垃圾收集器-《深入了解Java虛拟機》學習筆記
采用标記-整理
主要有初始标記,并發标記,最終标記和篩選删除四部分,G1收集器主要的特點就是它雖然理論上還有新生代和老年代概念,但是卻将記憶體分為若幹個大小相等的region,會有一個優先回收清單,回收掉回收收益最大的那個region。G1收集器是一款在server端運作的垃圾收集器,專門針對于擁有多核處理器和大記憶體的機器,在JDK 7u4版本發行時被正式推出,在JDK9中更被指定為官方GC收集器。它滿足高吞吐量的同時滿足GC停頓的時間盡可能短。
G1與CMS優缺點對比
- 記憶體占用
雖然G1和CMS都使用卡表來處理跨代指針,但G1的卡表實作更為複雜,而且堆中每個Region,無論扮演的是新生代還是老年代角色,都必須有一份卡表,這導緻G1的記憶集(和其他記憶體消耗)可能會占整個堆容量的20%乃至更多的記憶體空間;相比起來CMS的卡表就相當簡單,隻有唯一一份,而且隻需要處理老年代到新生代的引用,反過來則不需要,由于新生代的對象具有朝生夕滅的不穩定性,引用變化頻繁,能省下這個區域的維護開銷是很劃算的。
- 執行負載
譬如它們都使用到寫屏障,CMS用寫後屏障來更新維護卡表;而G1除了使用寫後屏障來進行同樣的(由于G1的卡表結構複雜,其實是更煩瑣的)卡表維護操作外,為了實作原始快照搜尋(SATB)算法,還需要使用寫前屏障來跟蹤并發時的指針變化情況。
CMS的寫屏障實作是直接的同步操作,而G1就不得不将其實作為類似于消息隊列的結構,把寫前屏障和寫後屏障中要做的事情都放到隊列裡,然後再異步處理。
- Shenandoah
- ZGC
- 染色指針技術