垃圾回收方法(算法,垃圾收集器)
前提
- jdk1.8以上(已經無永久代(Permanent Generation (PermGen),變成元空間(Metaspace))
算法
- 基礎算法
複製算法(新生代使用)
標記-清除算法(一般老生代使用)
標記-整理算法(一般老生代使用) - 分代收集算法(Generational Collection),就是平時我們總說的gc
新生代一般使用複製算法,老生代一般使用標記-整理算法,元空間(過閥值就收集)
分代收集算法(Generational Collection)垃圾收集器怎麼區分
- 是單線程還是多線程?
- 階段不同?
- 是否Stop The Word ?(業務線程是否停止)
垃圾收集器幾個問題
- 是新生代,老生代還是新生代和老生代可以使用?
垃圾收集器類別
收集器 | 新/老生代 | 階段說明 | 單/多線程進行收集 | 是否Stop The Word | 備註 |
---|---|---|---|---|---|
Serial | 新 | 單 | 是 | 無 | |
ParNew | 新 | 多 | 是 | Serial多線程版本 | |
Parallel Scavenge | 新 | 多 | 是 | 吞吐量高(其他都是Stop The Word時間短),用於後臺運算而不需要太多交互的任務 | |
Serial Old | 老 | 單 | 是 | Serial老年代版本 | |
Par Old | 老 | 多 | 是 | Parallel Scavenge老年代版本 | |
CMS(Concurrent Mark Sweep) | 老 | 1.初始標記2.併發標記3.重新標記4.併發清除 | 單 | 1,3階段 | 1.併發指的是與業務線程。2.有缺點。3.適合B/S。4.其爲標記-清除(其他爲標記整理),所以會產生碎片。 |
G1(Garbage First) | 老 | 1.設置垃圾收集不超過多少毫秒2.劃分區域 |
備註:一般ParNew和CMS配合使用
垃圾回收器總結
-因爲使用的是分代收集算法(Generational Collection),所以 一般情況下,所有收集器新生代都使用複製算法,老生代都使用標記-整理算法