JVM经典垃圾回收器之 Parallel Scavenge收集器 和 parallel Old 收集器
Parallel Scavenge 是一个新生代收集器,基于标记-复制算法。
Parallel Scavenge 收集器的目标是达到一个可控制的吞吐量,即吞吐量优先。
请注意:
软件性能指标的吞吐量概念与JVM中吞吐量概念略有不同。
软件性能指标的吞吐量:单位时间内系统处理用户的请求数;
JVM的吞吐量:运行用户代码时间/(运行用户代码时间+允许垃圾收集时间)
Parallel Old 是Parallel Scavenge 的老年代版本,基于标记-整理算法。
Parallel Scavenge + Parallel Old 是JDK9之前虚拟运行在server 模式下的默认值,
在JDK9后,可以使用 UseParallelGC 来打开。
+UseParallelGC = 新生代ParallelScavenge + 老年代ParallelOld
+UseParallelOldGC = 同上
-UseParallelOldGC = 新生代ParallelScavenge + 老年代SerialOld
相关使用测试如下:
测试环境: win10 JDK8 IDEA
-XX:+PrintCommandLineFlags:

使用 PrintCommandLineFlags 用于打印所有的JVM 参数(显式的和隐式的都会展示),可以看见在JDK8环境下,默认会启用 UseParallelGC 参数。
显式指明使用 parallelOld :UseParallelOldGC 如下图:

可以看见,使用 UseParallelOldGC 后,打印出 JVM参数时,没有打印 UseParallelGC,因为使用 parallelOldGC ,其实就指定了新生代默认使用 parallel Scavenge 收集器。
查阅了JVM相关源码gcConfiguration.cpp也可得知:
- // hotspot\share\gc\shared\gcConfiguration.cpp
- GCName GCConfiguration::young_collector() const {
- if (UseG1GC) {
- return G1New;
- }
- // 如果开启UseParallelGC则新年代使用ParallelScavenge
- if (UseParallelGC) {
- return ParallelScavenge;
- }
- if (UseConcMarkSweepGC) {
- return ParNew;
- }
- if (UseZGC) {
- return NA;
- }
- return DefNew;
- }
- GCName GCConfiguration::old_collector() const {
- if (UseG1GC) {
- return G1Old;
- }
- if (UseConcMarkSweepGC) {
- return ConcurrentMarkSweep;
- }
- // 如果开启UseParallelOldGC则老年代使用ParallelOld,否则使用SerialOld
- if (UseParallelOldGC) {
- return ParallelOld;
- }
- if (UseZGC) {
- return Z;
- }
- return SerialOld;
- }
另外几个重要的JVM参数如下:
-XX:MaxGCPauseMillis 大于0的毫秒数,收集器将尽力保证内存回收花费的时间不超过用户设定值。假设,你设定为5,则垃圾回收时间占总时间的1/(1+5)。系统默认值为99。
-XX:GCTimeRatio 大于0 小于100的整数,也就是垃圾回收时间占总时间的比率。
-XX:+UseAdaptiveSizePolicy :垃圾回收器自适应调节策略(懒人可用这个)。
浙公网安备 33010602011771号