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

时间:2014-06-25 13:06:34

标签: java performance garbage-collection monitoring

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

简而言之,MBean和" pref counter"是JVM自诊断的主要来源。

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

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

" Perf counter"有关于GC的CPU使用率的准确信息。 " Perf专柜"可以通过sun.management.counter.perf.PerfInstrumentation访问。

Here你可以找到例子(JUnit test)dumping" perf counter"主机JVM。

您需要sun.gc.collector.0.timesun.gc.collector.1.time个计数器来衡量年轻人和老年人/完整GC的累计CPU使用率(请注意他们以滴答声报告)。