我们有一个正在尝试优化延迟的应用程序,我们希望减少在完整 GC 中花费的平均时间。用 "XX:+UseParallelGC" 我们看到的是这样的:
[myhost ~]$ /usr/local/jdk7/bin/jstat -gcutil 9793 1000
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 49.57 95.93 93.32 99.48 10086 390.628 387 1005.334 1395.962
56.99 0.00 7.42 93.32 99.48 10087 390.691 387 1005.334 1396.025
56.99 0.00 22.19 93.32 99.49 10087 390.691 387 1005.334 1396.025
56.99 0.00 36.28 93.32 99.49 10087 390.691 387 1005.334 1396.025
[myhost ~]$ ps -p 9793 -o etime=
4-12:40:52
当我们切换到使用“-XX:+UseParNewGC -XX:+UseConcMarkSweepGC”时,我们会看到更多完整的 GC:
[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
这是我们的堆设置:
-Xms256m -Xmx8192m -XX:PermSize=128m -XX:MaxPermSize=1024m
我们正在使用 JDK:
[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)
第一个实例有 4 天以上的正常运行时间。第二个实例只持续了几分钟。我们注意到它正在频繁地进行完整的 GC 并有很大的停顿,因此我们恢复了设置。
这里需要调整什么,以使 GC 统计数据不会偏离目标?