Serial 收集器
使用一个CPU或者一个收集线程区完成工作,工作期间,必须暂停其他所有线程。(Stop the world)新生代复制算法、老年代标记-压缩。
优势:简单而高效,对Client模式下的虚拟机来说很好。
ParNew收集器
Serial收集器多线程版本,除了用多条线程以外,其他行为包括Serial收集器可用参数、收集算法、Stop the world、对象分配规则、回收策略都与Serial收集器一样。可以与CMS收集器配合工作。
参数控制:
-XX:+UseParNewGC ParNew收集器
-XX:ParallelGCThreads 限制线程数量
Parrallel Scavenge收集器
Parrallel Scavenge收集器是一个新生代收集器,使用复制算法的收集器,是并行多线程收集器。关注的是达到一个可控制的吞吐量,即cpu用于运行用户代码时间与cpu消耗总时间的比值。吞吐量越高,cpu利用地越高效。
参数控制:-XX:+UseParallelGC 使用Parallel收集器+ 老年代串行
Serial Old收集器
Serial收集器地老年代版本,使用标记-整理算法 。
Parrallel Old收集器
Parrallel Scavenge收集器的老年代版本,使用多线程和标记整理算法。
CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
过程分为四个步骤:
- 初始标记:标记GC Roots能直接关联到的对象
- 并发标记:在进行GC Roots Tracing的过程
- 重新标记:修正并发标记期间银用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
- 并发清除
其中,初始标记和重新标记仍然需要“Stop The World”。
优点:并发收集、低停顿
缺点:产生大量空间碎片、并发阶段会降低吞吐量、无法处理浮动垃圾。
G1收集器
G1收集器具备如下特点:
1.并行与并发。
2.分代收集。
3.空间整合,G1从整体来看是基于“标记-整理”算法实现的收集器,从局部(两个Region之间)上来看是基于“复制”算法实现。
4.可预测的停顿。
使用G1收集器时,Java堆得内存布局就与其他收集器有很大区别,它将整个Java堆划分为多个大小相等的独立区域(Region),新生代和老年代不再是物理隔离的了,它们都是一部分region(不连续)的集合。
G1跟踪各个region里面的垃圾堆的价值大小(回收所获得的空间大小以及回收所需要的时间的经验值)
在G1收集器中,Region之间的对象引用以及其他收集器中的新生待与老年代之间的对象引用,虚拟机都是使用Remembered Set来避免全堆扫描的。G1中每个region都是有一个与之对应的
Remembered Set,虚拟机发现程序在对Reference类型的数据进行写操作时,会产生一个Write Barrier暂时中断写操作,检查Reference引用的对象是否处于不同的Region之中,如果是,便通过CardTable把相关引用信息记录到被引用对象所属的Region的Remembered Set中。
主要过程:
1.初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,并修改TAMS(Next Top at Mark Start)的值。需要停顿,时间短。
2.并发标记:从GC Root开始对堆中的对象进行可达性分析,找出存活的对象,耗时较长,但可以用户应用程序并行执行。
3.最终标记:
是为了修正在并发标记期间用户程序继续运行而导致标记产生变化的那一部分标记记录,虚拟机将这段时间对象变化记录在线程Remembered Set Logs里面,最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set中,需要停顿,但是可并行执行。
4.筛选回收:首先对各个region的回收价值和成本进行排序,根据用户期望的GC停顿时间来制定回收计划。