Parallel Scavenge是一款新生代垃圾收集器,我们非常有必要了解这款垃圾收集器,因为这款收集器可是JDK1.7和JDK1.8默认的新生代垃圾收集器。
对于新生代的垃圾回收一般都采用标记-复制算法,Parallel Scavenge也不例外,Parallel Scavenge也与ParNew收集器一样都是能够通过多线程并行收集的,那么Parallel Scavenge与ParNew相比有什么特别之处呢?
Parallel Scavenge的特别之处就在于它关注的是吞吐量,也就是运行代码时间与(运行代码时间+垃圾收集器时间)的比值,比如运行代码时间为99分钟,垃圾收集器运行时间为1分钟,那么吞吐量就是99%,追求高吞吐量可以最大程度的利用CPU资源完成运算的任务,这就比较适合关注后台运算,而与用户交互较少的场景。(CMS关注的是停顿时间)
Parallel Scavenge中提供了两个调整吞吐量相关的参数:
-XX:MaxGCPauseMillis
设置最大GC暂停时间的目标(以毫秒为单位)。这是一个软目标,并且JVM将尽最大的努力来实现它。默认情况下,没有最大暂停时间值。
下面的示例显示如何将最大目标暂停时间设置为500ms:
-XX:MaxGCPauseMillis = 500
当然你不能想当然的认为这个值设置的越小越好,你要知道Parallel Scavenge是如何做到控制停顿时间的?实际上就是简单的增加垃圾回收频率而已,也就是说你设置的停顿时间越短,垃圾回收的频率就会越频繁,比如:原来30秒一次垃圾回收,一次停顿2秒,现在由于设置的停顿时间为1秒,所以必须10秒执行一次垃圾回收,虽然停顿时间短了,但是吞吐量也低了。
-XX:GCTimeRatio
这个参数的值则应当是一个大于0小于100的整数,也就是垃圾收集时间占总时间的 比率,相当于吞吐量的倒数。譬如把此参数设置为19,那允许的最大垃圾收集时间就占总时间的5% (即1/(1+19)),默认值为99,即允许最大1%(即1/(1+99))的垃圾收集时间。
与Parallel Scavenge搭配使用的老年代垃圾收集器是Parallel Old,Parallel Old支持多线程并行收集,基于标记-整理算法实现,二者配合使用总比来说吞吐量要优于ParNew加CMS的组合。