我们想内部化JConsole / JVisualVM的某些功能,并从正在运行的应用程序中收集有关CPU使用率和内存消耗的数据。原因是,安全约束阻止我们在生产系统上向外部打开jmx端口。
可以通过MXBean监视所需的大多数数据,但是,用于垃圾收集的cputime仍然使我们望而却步。通过监视gc时间GarbageCollectorMXBean
没有用,因为它仅提供并行工作收集器的挂墙时间。
我认为可以使用ThreadMXBean来确定所有gc线程的cputime。我看不出有办法安全地标识那些线程。
有谁知道,JVisualVM如何计算该数字?
前段时间,我写了有关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.time
和sun.gc.collector.1.time
计数器来衡量新旧GC /完整GC的累计CPU使用率(请注意,它们以滴答表示)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句