当在JDK 8u172下在Solaris(SPARC)下运行Glassfish时,使用G1垃圾收集器时,我遇到一种奇怪的行为,Unloading
阶段的Remark
时间很长,并且越来越时间。
以下是刚启动应用程序服务器后的日志摘录:
2018-10-18T10:08:28.362 + 0200:9528.430:[GC备注2018-10-18T10:08:28.362 + 0200:9528.430:[Finalize Marking,0.0012164 secs] 2018-10-18T10:08:28.363 +0200:9528.431:[GC ref-proc,0.1783250秒] 2018-10-18T10:08:28.541 + 0200:9528.609:[正在卸载, 1.4087725秒],1.5954223秒] [时间:user = 10.79 sys = 0.04,真实= 1.60秒]
几天后:
2018-10-22T20:24:52.070 + 0200:392111.556:[GC备注2018-10-22T20:24:52.070 + 0200:392111.556:[Finalize Marking,0.0010811 secs] 2018-10-22T20:24:52.072 +0200:392111.557:[GC ref-proc,0.1432306秒] 2018-10-22T20:24:52.215 + 0200:392111.701:[正在卸载, 5.4160564秒],5.5672543秒] [Times:user = 41.16 sys = 0.06,real = 5.57 secs]
如您所见,Unloading
时间从1.6s增加到5.6s。
以下是Unloading
随时间变化的图表:
如您所见,它随时间线性增长。
以下是相关的命令行标志:
-XX:+ AlwaysPreTouch -XX:GCLogFileSize = 10485760 -XX:InitialHeapSize = 8589934592 -XX:MaxHeapSize = 8589934592 -XX:MetaspaceSize = 536870912 -XX:NumberOfGCLogFiles = 5 -XX:+ PrintGC -XX:+ PrintGCDateStamps -XX :+ PrintGCDetails -XX:+ PrintGCTimeStamps -XX:+ UnlockDiagnosticVMOptions -XX:+ UseCompressedClassPointers -XX:+ UseCompressedOops -XX:+ UseG1GC -XX:+ UseGCLogFileRotation -XX:+ UseLargePages -XX:+ UseLargePagesInMetaspace
在读取this blog post之后添加了标志-XX:+UseLargePagesInMetaspace
,但不幸的是它不能解决问题。我也查看了this other blog post和this question,但不幸的是,在这种情况下,所有提议的解决方案似乎都不适用。
当Glassfish服务器在其他操作系统/体系结构下运行时,我无法重现此错误。
答案 0 :(得分:3)
这是JDK中的错误:JDK-8199406 : Performance drop with Java JDK 1.8.0_162-b32。
根据错误说明和this discussion thread,此错误:
向JDK 8u192的迁移修复了该错误,Unloading
的时间现在变得更短并且是常量:
2018-10-24T11:57:48.479 + 0200:96295.786:[GC备注2018-10-24T11:57:48.480 + 0200:96295.786:[Finalize Marking,0.0012370 secs] 2018-10-24T11:57:48.481 +0200:96295.787:[GC ref-proc,0.0960026秒] 2018-10-24T11:57:48.577 + 0200:96295.883:[正在卸载, 0.2760147秒],0.3796341秒] [时间:用户= 1.51 sys = 0.02,真实= 0.38秒]