垃圾回收方法(算法,垃圾收集器)
前提
- 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),所以 一般情况下,所有收集器新生代都使用复制算法,老生代都使用标记-整理算法