jvm垃圾收集器-Serial收集器、ParNew收集器、Parallel收集器

jvm垃圾收集器(Serial收集器、ParNew收集器、Parallel收集器)

jvm垃圾收集器-Serial收集器、ParNew收集器、Parallel收集器

1、Serial收集器

Serial(串行)收集器是最基本、历史最悠久的垃圾收集器了。大家看名字就知道这个收集器是一 个单线程收集器了。它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃 圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( “Stop The World” ),直到它收集结束。
新生代采用复制算法,老年代采用标记-整理算法。
jvm垃圾收集器-Serial收集器、ParNew收集器、Parallel收集器
虚拟机的设计者们当然知道Stop The World带来的不良用户体验,所以在后续的垃圾收集器设计 中停顿时间在不断缩短(仍然还有停顿,寻找最优秀的垃圾收集器的过程仍然在继续)。

但是Serial收集器有没有优于其他垃圾收集器的地方呢?当然有,它简单而高效(与其他收集器的 单线程相比)。Serial收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率。 Serial Old收集器是Serial收集器的老年代版本,它同样是一个单线程收集器。它主要有两大用 途:一种用途是在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用,另一种用途是 作为CMS收集器的后备方案。

主要相关参数:

  • -XX:+UseSerialGC:使用SerialGC
  • -XX:+UseSerialOldGC:使用SerialOldGC(Serial的老年代版本)

2、ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为 (控制参数、收集算法、回收策略等等)和Serial收集器完全一样。默认的收集线程数跟cpu核数 相同,当然也可以用参数(-XX:ParallelGCThreads)指定收集线程数,但是一般不推荐修改。

新生代采用复制算法,老年代采用标记-整理算法。
jvm垃圾收集器-Serial收集器、ParNew收集器、Parallel收集器

主要相关参数:

  • -XX:+UseParNewGC:使用ParNewGC
  • -XX:ParallelGCThreads:指定收集线程数

3、Parallel收集器

1、Parallel Scavenge收集器是一个新生代收集器,他也是使用复制算法的收集器,又是并行的多线程收集器。他的特点是它的关注点与其他收集器不同,Paralle Scavenge收集器的目标是达到一个可控制的吞吐量。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行代码时间/(运行用户代码时间 + 垃圾收集时间)。

Paralle Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。

MaxGCPauseMillis参数允许的值是一个大于0的毫秒数,收集器将尽可能的保证内存回收花费的时间不超过特定值。不过大家不要认为如果把这个参数的值设置的稍小一点就能使得系统的垃圾收集速度变得更快,GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的:系统把新生代调小一些,收集300M新生代肯定比收集500M快,这也直接导致垃圾收集发生的更频繁,原来10秒收集一次,每次停顿100毫秒,现在变成5秒收集一次,每次停顿70毫秒,停顿时间的确下降,但吞吐量也在下降。

GCTimeRatio参数的值应当是一个大于0且小于100的整数,也就是垃圾收集时间占总时间的比率,相当于吞吐量的倒数。如果把测参数设置为19,那允许的最大GC时间就占总时间的5%(即1/(1+19))。

除了上面两个参数以外,Paralle Scavenge收集器还有一个参数-XX:UseAdaptiveSizePolicy值得关注。这是一个开关参数,当这个开关打开之后,就不需要手动指定新生代的大小(-Xmn)、Eden与Survivor区的比列(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PertenureSizeThreshold)等参数细节了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。

2、Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

新生代采用复制算法,老年代采用标记-整理算法。

jvm垃圾收集器-Serial收集器、ParNew收集器、Parallel收集器
主要相关参数:

  • -XX:+UseParallelGC:使用ParallelGC
  • -XX:+UseParallelOldGC:ParallelGC的老年代版本
  • -XX:MaxGCPauseMillis:最大垃圾收集停顿时间
  • -XX:GCTimeRatio:设置吞吐量大小
  • -XX:UseAdaptiveSizePolicy:设置动态调整堆内存分配
  • -XX:UseAdaptiveSizePolicy:设置动态调整堆内存分配