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也可得知:

  1. // hotspot\share\gc\shared\gcConfiguration.cpp
  2. GCName GCConfiguration::young_collector() const {
  3. if (UseG1GC) {
  4. return G1New;
  5. }
  6. // 如果开启UseParallelGC则新年代使用ParallelScavenge
  7. if (UseParallelGC) {
  8. return ParallelScavenge;
  9. }
  10. if (UseConcMarkSweepGC) {
  11. return ParNew;
  12. }
  13. if (UseZGC) {
  14. return NA;
  15. }
  16. return DefNew;
  17. }
  18. GCName GCConfiguration::old_collector() const {
  19. if (UseG1GC) {
  20. return G1Old;
  21. }
  22. if (UseConcMarkSweepGC) {
  23. return ConcurrentMarkSweep;
  24. }
  25. // 如果开启UseParallelOldGC则老年代使用ParallelOld,否则使用SerialOld
  26. if (UseParallelOldGC) {
  27. return ParallelOld;
  28. }
  29. if (UseZGC) {
  30. return Z;
  31. }
  32. return SerialOld;
  33. }

 

 

另外几个重要的JVM参数如下:

-XX:MaxGCPauseMillis 大于0的毫秒数,收集器将尽力保证内存回收花费的时间不超过用户设定值。假设,你设定为5,则垃圾回收时间占总时间的1/(1+5)。系统默认值为99

-XX:GCTimeRatio 大于0 小于100的整数,也就是垃圾回收时间占总时间的比率。

-XX:+UseAdaptiveSizePolicy :垃圾回收器自适应调节策略(懒人可用这个)。

 

posted @ 2021-07-19 17:43  烟花一乐  阅读(826)  评论(0)    收藏  举报