如何确定应用程序中的gc-cpu利用率?

Jon*_*han 8 java performance monitoring garbage-collection

我们希望内化JConsole/JVisualVM的一些功能,并从正在运行的应用程序中收集有关cpu利用率和内存消耗的数据.原因是,安全约束阻止我们在生产系统上向外部打开jmx端口.

可以通过MXBeans监视所需的大多数数据,但是,用于垃圾收集的cputime仍然无法实现.通过GarbageCollectorMXBean它监控gc-time 是没有用的,因为它只提供并行工作收集器的挂壁时间.

我假设可以使用ThreadMXBean来确定所有gc-threads的cputime.我看不到安全识别这些线程的方法.

有谁知道,JVisualVM如何计算这个数字?

Ale*_*zin 6

前一段时间,我写了有关JVM诊断API的摘要,可在此处获得

简而言之,MBean和“首选计数器”是JVM自我诊断的主要来源。

JVisualVM正在使用GarbageCollectorMXBean将挂钟时间解释为CPU时间(即显示废话)。

ThreadMXBean不包括GC线程是线程列表,因此它也没有用。在SJK工具中,我从进程CPU时间中减去所有应用程序线程的累积CPU时间。这种方法不准确,但总比没有好。

“性能计数器”具有有关GC CPU使用率的准确信息。可以通过访问“性能计数器” sun.management.counter.perf.PerfInstrumentation

在这里,您可以找到转储主机JVM的“性能计数器”的示例(JUnit测试)。

您需要sun.gc.collector.0.timesun.gc.collector.1.time计数器来测量新旧GC /完整GC的累计CPU使用率(请注意,它们以滴答表示)。