切换到“-XX:+ UseParNewGC -XX:+ UseConcMarkSweepGC”导致更多完整的GC

时间:2016-10-18 20:08:56

标签: java java-7 jdk1.7

我们有一个应用程序正在尝试优化延迟,我们希望减少在完整GC中花费的平均时间。使用“XX:+ UseParallelGC”这就是我们所看到的:

[myhost]$ /usr/local/jdk7/bin/jstat -gcutil 2514 1000
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.19    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.19    716   28.151    24   44.250   72.401
  0.00   0.00   5.92  99.44  24.19    716   28.151    24   56.361   84.512
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00  34.98  99.87  24.20    720   28.319    27   68.708   97.026
100.00   0.00 100.00  99.87  24.20    721   28.319    28   68.708   97.026
100.00   0.00 100.00  99.87  24.20    721   28.319    28   68.708   97.026
100.00   0.00 100.00  99.87  24.20    721   28.319    28   68.708   97.026
100.00   0.00 100.00  99.87  24.20    721   28.319    28   68.708   97.026

当我们切换到使用“-XX:+ UseParNewGC -XX:+ UseConcMarkSweepGC”时,我们看到更多完整的GC:

 -Xms256m -Xmx8192m -XX:PermSize=128m -XX:MaxPermSize=1024m

这是我们的堆设置:

[myhost ~]$ /usr/local/jdk7/bin/java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=261346688 -XX:MaxHeapSize=4181547008 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

我们正在使用JDK:

'

第一个实例有4天以上的正常运行时间。第二个例子只有几分钟。我们注意到它频繁地完成了GC并且有很大的停顿,因此我们恢复了设置。

这里需要调整什么才能让GC统计数据不在墙上?

2 个答案:

答案 0 :(得分:0)

在之前的捕获中,只有记录,但每个事件都有1005个完整的GC时间。在您的第二次捕获中,它显示了更多记录,但每个事件仅有44~68个完整的GC时间。因此,如果您总结第1次和第2次捕获的完整GC时间,则更改配置后的第2次实际GC时间将减少。

答案 1 :(得分:0)

通过人体工程学,您可以提供与默认的平台相关选择一起调整与应用程序属性相关的GC行为的参数。更改收集器的事实并未指定调整如何影响执行的GC计数,这并不能说明收集器选择是错误的,因为问题可能是由其他原因引起的。

在行为方面, ConcMarkSweepGC 保证应用程序中的暂停时间更短,但生成的GC事件中的任何内容。尽管您的第二次测试表明Full GC的平均时间有所改善,但您需要测试更长的时间才能了解收集器如何调整自身以满足指标。

  

根据最近的历史记录,并发收集器会维护在终生代用尽之前剩余时间的估计值以及并发收集周期所需的时间。基于这些动态估计,将开始并发收集周期,目的是在终生代用尽之前完成收集周期。

除此之外,你必须运行一些案例(包括测试其他收集器),以便在GC(收集器的承诺)和执行的GC事件所花费的时间之间取得适当的平衡,你可以到那里进行测试对于可以控制对象如何被提升的参数(基于世代假设),或者在获取收集器之前可接受的堆使用情况,例如:

-XX:NewRatio=<N>
-XX:CMSInitiatingOccupancyFraction=<N>