我使用 jstat 来获取GC操作的总累计时间,即 GCT
所以,假设GCT是2秒,我的JVM进程启动了60秒,我是在四核服务器上运行,所以我的GC%
2 / 60 * 4 = 0.83%
我的计算是否正确?
答案 0 :(得分:6)
不,您的计算不准确,因为这样,您不知道操作系统允许程序运行的确切时间。
假设您要考虑GC完全停止应用程序的时间(暂停时间),您可以使用以下JVM选项:
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime
这个选项会使JVM打印到stdout:
Application time: 3.3319318 seconds
Total time for which application threads were stopped: 0.7876304 seconds
Application time: 2.1039898 seconds
Total time for which application threads were stopped: 0.4100732 seconds
然后,您可以总结应用程序停止的时间,并将其除以应用程序时间加上暂停时间的总和,以获得更改器利用率(GC不会暂停应用程序的时间的一小部分)。 / p>
答案 1 :(得分:3)
正确的计算是(time spent in logic) / (time spent in gc)
,但获取第一条信息通常需要一个分析器。
答案 2 :(得分:1)
PrintGCDetails - 此选项可能会有所帮助。它会删除有关每个垃圾收集的信息。
[GC
[PSYoungGen: 99952K->14688K(109312K)]
422212K->341136K(764672K), 0.0631991 secs]
[Times: user=0.83 sys=0.00, real=0.06 secs]
提供CPU使用率和已用时间信息。价值 用户权限是执行垃圾回收所使用的CPU时间 操作系统外的说明。在这个例子中, 垃圾收集器使用0.06秒的用户CPU时间。价值 sys的权限是操作系统代表的CPU使用时间 垃圾收集器。在这个例子中,垃圾收集器没有 使用任何CPU时间代表执行操作系统指令 垃圾收集。真实权利的价值是经过的 垃圾收集的挂钟时间,以秒为单位。在这个例子中, 完成垃圾收集需要0.06秒。
Java Performance - 好书,可以在数字版中找到。包含一篇关于测量GC影响的精彩文章。
答案 3 :(得分:0)
不,计算不正确。您想要计算的是
( CPU spent on GC ) / ( total CPU spent on JVM)
正如其他评论中指出的那样,“在JVM上花费的总CPU”将低于60 * 4,因为它假设您的应用程序完全系统负载,并且没有操作系统或其他应用程序花费的CPU周期。在linux上,可以使用“time”和“ps”命令在这里查找正确的数字。
但是,jstat命令也难以找到“花在GC上的CPU”。我怀疑jstat会报告挂钟时间(而不是CPU时间),这对于上面的计算是无用的 - 再次,您不知道GC是否在挂钟时间段内完全加载了所有内核。令人惊讶的是,没有明确的文档说明jstat命令报告了什么样的时间(挂钟与CPU) - 如果我错过了,请在这里发表评论。