如何使用JMX计数器计算Java垃圾回收率?

如何使用JMX计数器计算Java垃圾回收率?,java,garbage-collection,jvm,jmx,Java,Garbage Collection,Jvm,Jmx,我想从目标JVM(热点和IBM JVM)使用我的JMX客户机测量“gc比率百分比”。我可以通过JMX获得以下计数器: JVM正常运行时间(挂钟时间) JVM进程cpu时间 芯数 每个垃圾收集器的收集时间 有了这些输入计数器,计算“gc比率”的最佳公式是什么 我尝试过以下公式: collection_time / jvm_process_cpu_time * 100% 但在某些情况下,收集时间可能超过jvm进程cpu时间(>100%的比率),因此显然,收集时间必须是挂钟时间。那么,我可以使用

我想从目标JVM(热点和IBM JVM)使用我的JMX客户机测量“gc比率百分比”。我可以通过JMX获得以下计数器:

  • JVM正常运行时间(挂钟时间)
  • JVM进程cpu时间
  • 芯数
  • 每个垃圾收集器的收集时间
有了这些输入计数器,计算“gc比率”的最佳公式是什么

我尝试过以下公式:

collection_time / jvm_process_cpu_time * 100%
但在某些情况下,收集时间可能超过jvm进程cpu时间(>100%的比率),因此显然,收集时间必须是挂钟时间。那么,我可以使用以下公式进行计算:

collection_time / (jvm_process_cpu_time * nbr_of_cores) *100%
或者只是:

collection_time / jvm_uptime *100%
我还发现了文章(),其中描述了如何获取采集cpu时间而不是挂钟时间,但在我的测试之后,它报告的采集时间与
GarbageCollectorMXBean.getCollectionTime()
完全相同

Br,

Jouni

你想解决的真正问题是什么?这应该会指引你。在任何情况下,CPU时间似乎都不太可能是正确的指标,除非您的应用程序在所有内核上始终保持100%。我们需要将gc活动监控添加到应用程序的自我监控功能中。我们有几十个JVM需要监控,而且在客户安装上也应该是全天候活动的,因此不能使用JVM的GC日志参数。在这种情况下,
collection\u time/uptime
可能就足够了,因为它可以让您了解GC运行的频率。其他任何东西都几乎肯定是错误的精度。你想解决的真正问题是什么?这应该会指引你。在任何情况下,CPU时间似乎都不太可能是正确的指标,除非您的应用程序在所有内核上始终保持100%。我们需要将gc活动监控添加到应用程序的自我监控功能中。我们有几十个JVM需要监控,而且在客户安装上也应该是全天候活动的,因此不能使用JVM的GC日志参数。在这种情况下,
collection\u time/uptime
可能就足够了,因为它可以让您了解GC运行的频率。其他任何东西都几乎肯定是错误的精度。你想解决的真正问题是什么?这应该会指引你。在任何情况下,CPU时间似乎都不太可能是正确的指标,除非您的应用程序在所有内核上始终保持100%。我们需要将gc活动监控添加到应用程序的自我监控功能中。我们有几十个JVM需要监控,而且在客户安装上也应该是全天候活动的,因此不能使用JVM的GC日志参数。在这种情况下,
collection\u time/uptime
可能就足够了,因为它可以让您了解GC运行的频率。其他任何东西几乎肯定都是错误的精确性。