垃圾收集器
- Serial 收集器
用于新生代收集
单线程收集器,只使用一个CPU或一条收集线程去完成垃圾收集工作,且它进行垃圾收集时必须暂停其他所有的工作线程,直到它完成收集工作。
启用该收集器时:
- [ ] 新生代采取复制算法,暂停所有用户线程
- [ ] 老年代采取标记-整理算法,暂停所有用户线程 - ParNew 收集器
用于新生代收集
就是Serial 收集器的多线程版本,是并行收集器,使用多条线程进行垃圾收集
启用该收集器时:
- [ ] 新生代采用复制算法,多线程收集,暂停所有用户线程
- [ ] 老年代采取标记-整理算法,单线程收集,暂停所有用户线程 - Parallel Scavenge 收集器
用于新生代收集
采取复制算法,是并行收集器,使用多线程进行垃圾收集,暂停所有用户线程
Parallel Scavenge 收集器的目的是达到一个可控制的吞吐量,吞吐量=运行用户代码时间/(运行用户代码时间 + 垃圾收集时间)
通过两个参数:最大垃圾收集时间、垃圾收集时间占总时间的比率
GC自适应调节策略,打开此开关,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整参数以提供最合适的停顿时间或者最大的吞吐量。 - Serial Old 收集器
用于老年代收集
单线程收集器,只使用一个CPU或一条收集线程去完成垃圾收集工作,且它进行垃圾收集时必须暂停其他所有的工作线程,直到它完成收集工作。
启用该收集器时:
- [ ] 新生代采取复制算法,暂停所有用户线程
- [ ] 老年代采取标记-整理算法,暂停所有用户线程 - Parallel Old 收集器
用于老年代收集
就是Parallel 收集器的老年代版本,是并行收集器,使用多条线程进行垃圾收集
启用该收集器时:
- [ ] 新生代采用复制算法,多线程收集,暂停所有用户线程
- [ ] 老年代采取标记-整理算法,多线程收集,暂停所有用户线程 - CMS 收集器
用于老年代收集
以获取最短回收停顿时间为目标,基于标记-清除算法,它的运作过程分为4个阶段
- [ ] 初始标记:单线程,暂停所有用户线程
- [ ] 并发标记:单线程,和用户线程并发
- [ ] 重新标记:多线程,暂停所有用户线程
- [ ] 并发清除:单线程,和用户线程并发
** 缺点 **
a. 并发阶段,会占用一部分线程而导致应用程序变慢,总吞吐量会降低
b. 并发清理阶段用户线程还在运行,伴随程序运行还会有新的垃圾会产生,这部分垃圾在标记阶段之后,当次收集中无法收集
c. CMS收集器是基于标记-清除算法实现的,所以收集结束时可能会产生大量空间碎片。 - G1 收集器
同时用于新生代和老年代
采用标记整理算法,将堆分为不同大小相等的独立区域(Region),G1追踪每个Region的垃圾堆积的价值大小,然后有一个优先列表,优先回收价值最大的Region,避免在整个堆中进行安全区域的垃圾收集,能建立可预测的停顿时间模型。整个过程4个步骤:
- [ ] 初始标记:单线程,暂停所有用户线程
- [ ] 并发标记:单线程,和用户线程并发
- [ ] 最终标记:为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,暂停所有用户线程,并行回收
- [ ] 筛选回收:对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间制定回收计划,暂停所有用户线程,并行回收