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

Java 如何确定应用程序中的gc cpu利用率?,java,performance,garbage-collection,monitoring,Java,Performance,Garbage Collection,Monitoring,我们希望将JConsole/JVisualVM的一些功能内部化,并从正在运行的应用程序中收集有关cpu利用率和内存消耗的数据。原因是,安全约束阻止我们在生产系统上对外开放jmx端口 所需的大部分数据都可以通过MXBeans进行监控,但是,用于垃圾收集的cputime仍然无法实现。通过GarbageCollectorMXBean监视gc时间是没有用的,因为它只提供并行工作收集器的walltime 我假设可以使用ThreadMXBean来确定所有gc线程的cputime。我看不到任何方法可以安全地识

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

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

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


有人知道JVisualVM是如何计算这个数字的吗?

不久前,我写了一篇关于JVM诊断API的总结,它是可用的

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

JVisualVM正在使用垃圾收集器MXBean将挂钟时间解释为CPU时间(即显示无意义)

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

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

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

您需要
sun.gc.collector.0.time
sun.gc.collector.1.time
计数器,用于测量年轻和年老/完整gc的累积CPU使用率(请注意,它们是以刻度报告的)