2014-06-25 33 views
5

我们想内部化JConsole/JVisualVM的一些功能,并从正在运行的应用程序中收集有关cpu利用率和内存消耗的数据。原因是,安全限制使我们无法在生产系统上将jmx端口打开到外部。如何确定应用程序内的gc-cpu利用率?

大部分所需的数据都可以通过MXBeans进行监控,但是,用于垃圾收集的cputime仍然不见了。通过GarbageCollectorMXBean监测gc时间并不有用,因为它仅提供并行工作收集器的壁挂时间。

我认为可以使用ThreadMXBean来确定所有gc线程的cputime。我看不到安全识别这些线程的方法。

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

回答

2

前段时间我写了关于JVM诊断API的总结,它可用here

总之,MBean和“pref计数器”是JVM自我诊断的主要来源。

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

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

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

Here您可以找到示例(JUnit测试)转储主机JVM的“perf计数器”。

您需要sun.gc.collector.0.timesun.gc.collector.1.time计数器,用于测量年轻人和老人/完全GC的累计CPU使用率(请注意,他们以tick计)。

相关问题