我正在使用jstat来获取 GC 操作的总累积时间,即GCT
所以,假设 GCT 是 2 秒,我的 JVM 进程启动了 60 秒,我是在四核服务器上运行,所以我的 GC 百分比是
2 / 60 * 4 = 0.83%
我上面的计算正确吗?
我正在使用jstat来获取 GC 操作的总累积时间,即GCT
所以,假设 GCT 是 2 秒,我的 JVM 进程启动了 60 秒,我是在四核服务器上运行,所以我的 GC 百分比是
2 / 60 * 4 = 0.83%
我上面的计算正确吗?
不,您的计算不准确,因为这样,您不知道操作系统允许您的程序运行的确切时间。
假设您要考虑应用程序被 GC 完全停止的时间(暂停时间),您可以使用以下 JVM 选项:
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime
此选项将使 JVM 将类似这样的内容打印到标准输出:
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
然后,您可以总结应用程序停止的时间,并将其除以应用程序时间加上暂停时间的总和,以获得 mutator 利用率(应用程序未被 GC 暂停的时间分数)。
不,不是。您的计算假设 java 进程在整个时间内对所有 4 个内核的利用率为 100%。
正确的计算是(time spent in logic) / (time spent in gc)
但获得第一条信息通常需要一个分析器。
PrintGCDetails - 此选项可能会有所帮助。它打印有关每个垃圾收集的信息。
[GC
[PSYoungGen: 99952K->14688K(109312K)]
422212K->341136K(764672K), 0.0631991 secs]
[Times: user=0.83 sys=0.00, real=0.06 secs]
提供 CPU 使用率和经过的时间信息。user右边的值是垃圾收集在操作系统外执行指令所使用的CPU时间。在此示例中,垃圾收集器使用了 0.06 秒的用户 CPU 时间。sys 右边的值是操作系统代表垃圾收集器使用的 CPU 时间。在此示例中,垃圾收集器没有使用任何 CPU 时间来代表垃圾收集执行操作系统指令。real 右边的值是垃圾收集的经过的挂钟时间(以秒为单位)。在此示例中,完成垃圾收集需要 0.06 秒。
Java Performance - 好书,可以在数字版中找到。包含一篇关于衡量 GC 影响的精彩文章。
不,计算不正确。你要计算的是
( 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)的明确文档——如果我错过了,请在此处发表评论。