接下来主要介绍的是老年代相关的收集器
4.Serial Old收集器
Serial Old收集器是Serial收集器的老年代版本,同样是单线程的收集器,在老年代使用的是标记-整理 算法,是给Client使用的老年代,
在Server端,他还可以和Parallel Scavenge收集器搭配使用,另个一个就是作为CMS的收集器后备方案
5.Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用了多线程+ 标记-整理 算法,
他的出现是为了避免在老年代,Parallel Scanvenge没有合适的老年代收集器去搭配而出现的
在其出现之后,Parallel Scanvenge加Parallel Old收集器可以针对注重吞吐量的场合了
6.CMS是一个老年代的收集器,还是以获取最短的停顿时间为目标的收集器,
全称为Concurrent Mark Sweep,基于了标记清除 算法
其回收流程分为了
1.初始标记
2.并发标记
3.重新标记
4.标记清除
初始标记和重新标记两个步骤需要 Stop the World,
初始标记是标记能从GC Roots关联的对象
并发标记是进行GC Roots Tracing的过程
重新标记是修正并发标记过程中,继续运作而导致的变动的对象的标记
标记清除,就是简单的清理
虽然已经做到并发收集,低停顿了
但是其仍然具有很明显的缺点
1.对CPU资源敏感,在运行收集器线程的时候,会导致用户程序执行的速度下降
2.无法处理浮动垃圾,在进行并发清除的过程中,会可能伴随着进程运行产生新的垃圾,这种垃圾在本次运行中无法被收集使用,只能等待下一次的GC回收
这就是CMS为啥不能再老年代满了再回收,必须预留一些空间给浮动垃圾使用,这个空间占比是可以通过参数-XX:CMSInitiatingOccupancyFraction来设置的
可以通过提高参数来提高触发百分比
3.由于CMS时使用了标记-清理方法,会导致带来内存碎片,于是可以通过设置
-XX:UseCMSCompactAtFullCollection开发参数,来在FullGC的时候,在清理完进行碎片的整理
但是这样会带来停顿时间的增加,
于是还有另一个参数-XX:CMSFullGCsBeforeCompaction,来设置在多少次清理后来一次来碎片压缩的清理