【发布时间】:2015-05-22 09:45:48
【问题描述】:
在 Java 8 Update 45 中,将这些选项添加到 java 调用中:
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
显示如下统计数据:
vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count
3679.229: no vm operation [ 72 1 2 ] [ 6016 0 6016 0 0 ] 1
2015-05-22T11:25:27.519+0200: Total time for which application threads were stopped: 6.0168551 seconds, Stopping threads took: 6.0164099 seconds
这里的问题是Stopping threads 的时间很长。在这个例子中,6 秒对我们的应用程序来说已经是个问题了,但我看到的时间甚至更长,在一个实例中(虽然没有完整的日志记录)将近一分钟。
VM 操作(此处为:no vm operation)是变化的。我也见过,例如RevokeBias、G1IncCollectionPause 或 GCG_Operation。此外,page_trap_count 似乎无关紧要。我已经看到它为 0 的示例,以及其他为 2 的示例。但一致的是,时间始终反映在 spin 和 sync 的值中。
我正在寻找对这些计时值 spin 和 sync 的深入解释,但我最感兴趣的是为什么会发生这种情况以及我可以做些什么来解决它。我不知道我们的配置中有任何“邪恶”。机器上有很多无聊的内核和未使用的内存,我们运行的是纯 Java(没有 JNI),我们不知道代码中有任何过度同步。
【问题讨论】:
-
您可以提供更多具体用例的详细信息,以便人们知道如何提供帮助。
-
实际上,我不仅在我们的一个应用程序中看到了这一点,而且我也全面看到了这一点。所以实际上并没有一个特定的用例。如果我知道要寻找什么,我可以去寻找相似之处。然而,我有点怀疑,很多人有同样的问题,但还没有注意到。指向我的日志记录“停止线程占用:”是相当新的。
标签: java garbage-collection g1gc