从JDK7迁移到JDK 8时,我开始看到频繁的Full GC(具有更高的GC延迟)。在分析了gc之后,发现在年轻的GC之后,元空间的使用增加了,而旧的用法保持不变。 我已将最大元空间大小(等于JDK7中的Perm Gen)设置为256MB。当使用率达到210 MB左右时,将触发完整GC。我已经尝试将metaspace max size设置为512MB,然后我也看到Metaspace Threshold导致Full GC。
为什么Young GC会导致元空间大小增长?
GC延迟与JDK8紧密相关。使用JDK7时,GC延迟通常低于100毫秒,而使用JDK8的全GC启动时间为800-1000毫秒。这会影响我的应用程序性能。我正在使用并行GC算法。我怀疑在metaspace上的GC比Old gen GC要耗费更多时间。有关为JDK8调优JVM的任何建议都会非常有用。
Young GC:
S0 S1 E O M CCS YGC GCT FGC FGCT GCT LGCC GCC
0.00 40.28 99.78 21.95 56.28 - 149 6.647 2 3.276 9.924 Allocation Failure No GC
54.17 0.00 0.66 21.95 57.63 - 150 6.661 2 3.276 9.937 Allocation Failure No GC
Full GC:
0.00 72.80 0.00 25.15 82.51 - 213 8.550 3 3.276 11.826 Metadata GC Threshold Metadata GC Threshold
0.00 72.80 0.00 25.15 82.51 - 213 8.550 3 3.276 11.826 Metadata GC Threshold Metadata GC Threshold
Metaspace使用216684K,容量262051K,承诺262144K,保留262144K 2015-06-30T17:47:16.079 + 0000:17622.342:[完整GC(元数据GC阈值)[PSYoungGen:9550K-> 0K(1035776K)]