HotSpot经典垃圾收集器(1)

前言

前面我们讲了垃圾回收机制,那现在主流的垃圾回收器是怎么样,下面介绍几种HotSpot推出的几种经典的垃圾收集器。


Serial

Serial(串行),是JDK1.3之前唯一的垃圾收集器,他是单线程的,串行是因为在GC线程运行时,另外的用户线程都必须得停下。GC运行这段时间为Stop The World(简称STW),该垃圾收集器。

STW


ParNew

该垃圾收集器就是多线程版本的Serial,原来Serial的GC线程为单线程,ParNew为多线程GC,缩短了STW的时间。

这边我们需要知道ParNew只是一个新生代的垃圾收集器,采用的是复制算法,所以他是一个新生代的垃圾收集器。他可以搭配其他的老年代垃圾收集器进行使用,比如Serial Old,CMS等

Q1:ParNew是否一定比Serial好?
不一定。如果是单核CPU,Serial单线程的效率更高,因为只有一个核同一时刻只能跑一个线程,多线程带来的损耗主要是频繁切换CPU上下文,只有在CPU核多的情况下,ParNew的优势才会得到体现。


Parallel Scavenge

该垃圾收集器也是新生代的,采用的依然是复制算法,相比于ParNew,该GC有控制吞吐量和最大垃圾收集停顿时间(STW)的功能。

吞吐量 = 运行代码的时间 / (运行代码的时间+GC时间)

1
2
-xx:MaxGCPauseMills #最大垃圾收集停顿时间参数
-xx:GCTimeRatio #控制吞吐量大小

这里我们如果吧STW时间调小了,其实就是调小了新生代,这样每次收集的垃圾就会变少,GC的频次相对的也就上去了,吞吐量就下来了。我们需要找到一个合适的平衡来进行这两个参数的调优。

该垃圾收集器还有一个比较只能的地方就是他有GC自适应的调节策略:

1
-xx:UseAdaptiveSizePolicy #GC自适应的调节策略

即根据系统的运行情况动态去调整新生代大小,Eden区和Survivor区的比例,以及晋升老年代的对象等细节参数,达到一个最合适的停顿时间和吞吐量。


Parallel Old

该收集器是采用多线程和标记整理算法的老年代垃圾收集器。

黄金组合:
Parallel Scavenge + Parallel Old

在注重吞吐量以及CPU资源敏感的情况可以考虑使用该组合


如果有小伙伴,想要一起交流学习的,欢迎添加博主微信。

weChat