serial收集器
serial收集器是历史最悠久的。
serial收集器是单线程,当开始工作的时候,暂停所有正在执行的程序,然后执行垃圾收集。这点是很难接受的。但是在客户端使用的时候,它的有点是简单高效的。
parnew收集器
parnew收集器就是serial收集器的多线程版本,并没有多少创新之处。是需要运行在服务器模式下的首选。有一个与性能无关,但是很重要的原因,就是除了serial收集器,目前只有parnew收集器能和cms收集器一起配合工作。
parallel scavenge收集器
parallel scavenge收集器类似parnew收集器,但是他的关注点是可控制的吞吐量,可以通过最大垃圾收集停顿时间-xx:maxgcpausemillis以及直接设置吞吐量的大小-xx:gctimeratio。最大垃圾停顿时间不是越小越好,这里需要根据实际情况来设置。还有一个参数值得注意。-xx:+useadaptivesizepolice这是一个开关参数,这个参数打开后,不需要手动指定新生代的大小(-xmn),eden与survivor的比例,晋升老年代大小等细节参数。剩下的交给虚拟机完成就行了。自适应调节策略也是parallel scavenge收集器与parnew收集器的一个重要区别。
serial old收集器
serial old收集器时serial收集器的老年代版本,采用的是标记整理的算法。也是给客户机使用的。
parallel old收集器
parallel old收集器是parallel scavenge收集器的老年代版本。使用多线程和标记整理算法。
cms收集器
cms收集器解决的问题是:获取最短回收停顿时间为目标的收集器。cms收集器是基于标记清除算法实现的。分为四步实现
步骤一:初始标记:需要停止执行程序。仅仅是标记一下能够GC roots关联到的对象。
步骤二:并发标记:不需要停止执行程序。修正并发执行的时候,导致标记产生变动的那一部分对象。这部分是与用户进程同时进行的,
步骤三:重新标记:需要停止执行程序。
步骤四:并发清除:不需要停止执行程序。这部分是与用户进程同时进行的。
优点是并发收集,低停顿。
缺点是:1.对CPU资源很敏感。2.无法处理浮动垃圾。3.cms是基于标记清除算法的收集器,这样会产生大量的碎片,导致大对象无法放进来。
G1收集器
G1收集器的使命是在未来替换掉cms。
G1收集器的特点:1.并行与并发;2.分代收集;3.空间整合;4.可预测的停顿。
G1收集器之所以建立了可预测的停顿时间,是由于它将java堆划分为好多不同的区域,根据每个区域回收价值的大小,优先回收价值大的区域。但是这里面的实现细节非常复杂。
运行步骤
步骤一:初始标记
步骤二:并发标记
步骤三:最终标记
步骤四:筛选回收