You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JMX Exporter获取Prometheus格式的JVM GC停顿时间指标?

获取Prometheus格式的JVM GC停顿时间指标方案

一、调整JMX Exporter配置实现

你之前用的java.lang:name=G1 Young Generation,type=GarbageCollector MBean确实只默认暴露收集次数和总时间,但其实该MBean下的LastGcInfo属性包含单次GC的停顿时长,只需修改JMX Exporter的配置规则,就能导出这个指标。

示例配置

在你的JMX Exporter配置文件中添加以下规则:

rules:
  # 导出最近一次GC的停顿时间(转换为秒)
  - pattern: 'java.lang<type=GarbageCollector, name=(.+)><LastGcInfo>(duration)'
    name: jvm_gc_pause_duration_seconds
    labels:
      gc: "$1"
    help: "最近一次垃圾回收的停顿时长"
    type: GAUGE
    valueFactor: 0.001  # JMX返回的是毫秒,转成秒

  # 可选:补充总收集时间和次数的标准指标
  - pattern: 'java.lang<type=GarbageCollector, name=(.+)><>(CollectionTime)'
    name: jvm_gc_collection_seconds_sum
    labels:
      gc: "$1"
    help: "垃圾回收总耗时"
    type: COUNTER
    valueFactor: 0.001
  - pattern: 'java.lang<type=GarbageCollector, name=(.+)><>(CollectionCount)'
    name: jvm_gc_collection_count
    labels:
      gc: "$1"
    help: "垃圾回收次数"
    type: COUNTER

配置生效后,你就能拿到jvm_gc_pause_duration_seconds指标,对应不同GC收集器(比如G1 Young、G1 Old)的最近一次停顿时间。如果需要统计一段时间内的停顿分位数(比如95分位),可以用PromQL聚合:

histogram_quantile(0.95, sum(rate(jvm_gc_pause_duration_seconds_bucket[5m])) by (le, gc))

注:如果要生成直方图指标,需要额外配置JMX Exporter将停顿时间分桶,或者直接使用Micrometer等工具自带的直方图实现。

二、其他替代方案

如果需要更细粒度或开箱即用的GC停顿指标,还可以试试这些方法:

  • Micrometer集成:在应用中引入Micrometer的Prometheus注册器(比如Spring Boot项目加micrometer-registry-prometheus依赖),它会自动采集并暴露jvm_gc_pause_seconds直方图指标,包含多分位数的停顿数据,无需手动配置JMX规则。
  • OpenTelemetry Java Agent:通过无侵入的Java Agent注入,自动采集GC停顿事件并导出为Prometheus格式指标,同时支持链路追踪、其他JVM指标的统一采集。

内容的提问来源于stack exchange,提问作者Nirzak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:05:14