JVM的PrintGCApplicationConcurrentTime和PrintGCApplicationStoppedTime标志

13
我正在运行一个Java程序,需要获取每次垃圾回收所花费的时间。 我找到了这两个JVM标记: -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime 但我无法找到有关它们的信息。 我猜想PrintGCApplicationStoppedTime打印了应用程序在STW中的时间长度,但是我不确定-XX:+PrintGCApplicationConcurrentTime是否打印了应用程序与收集线程同时执行的时间长度?
提前致谢。
2个回答

11
这些标签的名称不是很准确。 PrintGCApplicationStoppedTime 显示应用程序在安全点停止的时间。 最常见的安全点是由垃圾收集的stop-the-world阶段引起的,然而还有许多其他原因存在。 PrintGCApplicationConcurrentTime 是应用程序在没有停止的情况下工作的时间,即两个连续安全点之间的时间。

使用这两个标志,我将获得许多应用程序停止时间和许多应用程序并发时间。根据您的解释,我会认为所有这些时间的总和将是总执行时间。然而,这个总和给出了以下结果:应用程序运行时间:4.47秒 应用程序停止时间:0.01秒``` 而使用`time`命令,我得到了13.97秒。我在这里漏掉了什么... - franco
@franco 在我的实验中,“应用程序时间”+“停止时间”实际上等于实际执行时间。在你的情况下,哪个输出是正确的?你确定你把所有结果都加起来了吗? - apangin
是的,你说得对!这是同一时间(我的错)。但我仍然有一个问题:例如,在CMS或G1GC收集器中,有线程与收集器线程并发工作。这个时间属于应用程序并发时间,对吗? - franco
1
@franco 是的,由于并发GC在安全点暂停之外运行,因此它的时间计入“应用程序并发时间”。 - apangin

0

你可以使用这些标志来了解应用程序在垃圾回收之间运行的时间

最终,这可以从GC日志中计算出来,但一个方便的方法是使用命令行标志-XX:+PrintGCApplicationStoppedTime-XX:+PrintGCApplicationConcurrentTime查看该信息。

将它们添加到你的命令行会产生如下输出:

Application time: 0.2863875 seconds
Total time for which application threads were stopped: 0.0225087 seconds
Application time: 0.1476791 seconds
Total time for which application threads were stopped: 0.0255697 seconds

应用程序运行(第一行报告)约287毫秒,然后停止约22毫秒(第二行报告)。

这些标志可以单独或一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接