计算Java服务器中GC时间的百分比

时间:2013-03-09 06:24:24

标签: java performance java-ee garbage-collection jvm

我使用 jstat 来获取GC操作的总累计时间,即 GCT

所以,假设GCT是2秒,我的JVM进程启动了60秒,我是在四核服务器上运行,所以我的GC%

2 / 60 * 4 = 0.83%

我的计算是否正确?

4 个答案:

答案 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>

另见http://prefetch.net/blog/index.php/2008/02/18/measuring-the-time-an-application-was-stopped-due-to-garbage-collection/

答案 1 :(得分:3)

不,不是真的。您的计算假设整个过程中java进程100%利用所有4个核心。

正确的计算是(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) - 如果我错过了,请在这里发表评论。