spring boot 2执行器 jvm.gc.memory.alulated 指标

Eli*_*ana 3 garbage-collection memory-management spring-boot spring-boot-actuator openjdk-11

我正在使用 Spring Boot 2.2.5 并通过 Spring Boot Actuator 和 Grafana 监控我的应用程序指标。

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

我的 gc 暂停时间很长,大约需要 1-2 秒,并且它与高jvm.gc.memory.allocated相关。

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

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

Eug*_*ene 7

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

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

在一次 GC 之后到下一次 GC 之前,随着年轻代内存池大小的增加而增加

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

如果您了解 GC 工作原理的一些基本知识并查看此代码,实际上事情相当简单。

分代垃圾收集器(如G1)将堆划分为区域youngold)。新对象的分配发生在 young 区域(除非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);
      }
}
Run Code Online (Sandbox Code Playgroud)

具体来说,它在这里定义:

... 结束于("伊甸园空间")

因此,此代码会拍摄GC 循环Used Space之前和之后快照,计算 a并将所有这些增量添加到单个值中。这就是现状。Eden Spacedeltajvm.gc.memory.allocated


这种方法测量应用程序在其生命周期内分配了多少空间,但只能通过年轻空间分配。恕我直言,你应该仔细看看它,因为:

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

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