接下来主要介绍的是老年代相关的收集器

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,来设置在多少次清理后来一次来碎片压缩的清理

发表评论

邮箱地址不会被公开。 必填项已用*标注