spring 引导 2 执行器 jvm.gc.memory.allocated 公制

spring boot 2 actuator jvm.gc.memory.allocated Metric

我正在使用 spring boot 2.2.5 并通过 spring boot actuator 和 Grafana 监控我的应用程序指标。

我的应用程序打包了 Docker(OpenJdk11) 并配置了 4GB 内存

我有 1-2 秒左右的长时间 gc 暂停,它与高 jvm.gc.memory.allocated 相关。

jvm.gc.memory.allocated 指标有时会达到 30GB

谁能解释一下 jvm.gc.memory.allocated 指标?这是什么意思?

如果你问我,这是一个相当奇怪的指标(从某种意义上说,掌握它并不容易)。慢慢来吧。

首先,它是由 micrometer here 生成的,如果您阅读了它的描述:

Incremented for an increase in the size of the young generation memory pool after one GC to before the next

这对您来说可能也没什么意义。我必须查看计算它的代码,才能了解它的作用。

如果您了解有关 GC 工作原理的一些基本知识并且 look at this code,实际上事情很简单。

A generational 垃圾收集器(如 G1)将堆划分为 regionsyoungold).新对象的分配发生在年轻区域(除非humongous,但我不会深入),特别是在Eden space。一旦 GC 被触发,Eden 被清除并且分配可以再次发生。这是相当简化的,并不 完全 正确(在 major/mixed 集合的情况下情况略有不同)。

既然这个理论已经到位,你可以看看isYoungGenPool是什么,来自:

if (youngGenPoolName != null) {
      final long youngBefore = before.get(youngGenPoolName).getUsed();
      final long youngAfter = after.get(youngGenPoolName).getUsed();
      final long delta = youngBefore - youngGenSizeAfter.get();
      youngGenSizeAfter.set(youngAfter);
      if (delta > 0L) {
           allocatedBytes.increment(delta);
      }
}

具体定义为here:

... endsWith("Eden Space")

因此,此代码拍摄快照 - Used Space 之前 之后 中的 GC 循环Eden Space,计算一个 delta 并将所有这些增量添加到一个值中。这就是 jvm.gc.memory.allocated


这种衡量您的应用程序在其生命周期内分配了多少,但仅通过 young space。恕我直言,你应该仔细看看它,因为 :

  • 它不跟踪大量分配(对此有不同的指标)

  • 它只适用于分代垃圾收集器(例如Shenandoah不是这样的收集器)