我正在测试基于 Jetty 的 API 与基于 Netty 的 API。实验中唯一的区别是我使用的 API(相同的应用程序、相同的服务器、相同的内存配置、相同的负载等),我使用基于 Netty 的 API 获得了更长的 GC 暂停。大多数情况下,停顿低于一毫秒,但在平稳运行几天后,每 12-24 小时我会看到 4-6 秒的停顿,而基于 Jetty 的 API 不会出现这种停顿。
每当发生这种情况时,关于 G1 正在做什么导致它发出 STW 的信息非常少,请注意此处的第二条暂停消息:
2016-02-23T05:22:27.709+0000: 66360.282: Total time for which application threads were stopped: 0.0319639 seconds, Stopping threads took: 0.0000716 seconds
2016-02-23T05:22:35.642+0000: 66368.215: Total time for which application threads were stopped: 6.9705594 seconds, Stopping threads took: 0.0000737 seconds
2016-02-23T05:22:35.673+0000: 66368.246: Total time for which application threads were stopped: 0.0048374 seconds, Stopping threads took: 0.0040574 seconds
我的 GC 选项是:
-XX:+UseG1GC
-XX:+G1SummarizeConcMark
-XX:+G1SummarizeRSetStats
-XX:+PrintAdaptiveSizePolicy
-XX:+PrintGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+DisableExplicitGC
-XX:InitialHeapSize=12884901888
-XX:MaxHeapSize=12884901888
而且,作为参考,我的 VM 选项是:
-XX:+AlwaysPreTouch
-XX:+DebugNonSafepoints
-XX:+FlightRecorder
-XX:FlightRecorderOptions=stackdepth=500
-XX:-OmitStackTraceInFastThrow
-XX:+TrustFinalNonStaticFields
-XX:+UnlockCommercialFeatures
-XX:+UnlockDiagnosticVMOptions
-XX:+UnlockExperimentalVMOptions
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
我如何找出为什么G1 停止了世界2016-02-23T05:22:35.642
?