我正在测试基于 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
并且,作为参考,我的虚拟机选项是:
-XX:+AlwaysPreTouch
-XX:+DebugNonSafepoints
-XX:+FlightRecorder
-XX:FlightRecorderOptions=stackdepth=500
-XX:-OmitStackTraceInFastThrow
-XX:+TrustFinalNonStaticFields
-XX:+UnlockCommercialFeatures
-XX:+UnlockDiagnosticVMOptions
-XX:+UnlockExperimentalVMOptions
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
我怎样才能知道whyG1让世界停止在2016-02-23T05:22:35.642
?
并非所有 STW 暂停 - 用于触发它们的机制称为安全点 http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html- 由GC引起,使用-XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1
打印其他安全点原因。
第二,if暂停是由 GC 引起的,那么您粘贴的行本身不包含原因,但 GC 日志中的相邻块应该包含原因,例如[GC pause (G1 Evacuation Pause) (young), 0.0200285 secs]
此外,您可能还想监控磁盘 IO 延迟并将时间戳与安全点暂停相匹配。安全点期间发生的任何同步 IO 或分页会导致存储速度变慢,可能会导致整个安全点停顿。放置日志文件和/tmp
在 tmpfs 或 SSD 上可能会有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)