Spring boot spring boot 2执行器jvm.gc.memory.allocated Metric

Spring boot spring boot 2执行器jvm.gc.memory.allocated Metric,spring-boot,memory-management,garbage-collection,spring-boot-actuator,openjdk-11,Spring Boot,Memory Management,Garbage Collection,Spring Boot Actuator,Openjdk 11,我正在使用SpringBoot2.2.5,并通过SpringBootActuator和Grafana监控我的应用程序指标 我的应用程序使用Docker(OpenJdk11)打包,并配置4GB内存 我有长时间的gc暂停,大约1-2秒,它与highjvm.gc.memory.allocated相关 jvm.gc.memory.allocated指标有时会达到30GB 有人能解释一下jvm.gc.memory.allocated的度量吗?这是什么意思?如果你问我的话,这是一个相当奇怪的指标(从某种意义

我正在使用SpringBoot2.2.5,并通过SpringBootActuator和Grafana监控我的应用程序指标

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

我有长时间的gc暂停,大约1-2秒,它与highjvm.gc.memory.allocated相关

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


有人能解释一下jvm.gc.memory.allocated的度量吗?这是什么意思?

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

首先,它是由测微计生成的,如果您阅读了它的描述:

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

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

如果您知道GC如何工作的一些基本情况,事实上,事情相当简单

分代垃圾收集器(如
G1
)将堆划分为多个区域(
young
old
)。新对象的分配发生在年轻区域(除非
humongous
,但我不会进入它),特别是在
Eden空间
。一旦GC被触发,
Eden
被清除,分配可以再次发生。这相当简单,而且不完全正确(对于
主要/混合的
集合,情况略有不同)

既然这一理论已经就位,您可以从以下方面了解什么是
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);
      }
}
具体而言,定义如下:

。。。endsWith(“伊甸园空间”)

因此,该代码在
伊甸园空间中的GC循环前后拍摄
使用空间的快照,计算
增量
,并将所有这些增量添加到单个值中。这就是
jvm.gc.memory.allocated
的含义


这类度量应用程序在其生命周期内分配了多少,但仅通过年轻空间。imho,你应该仔细看看,因为:

  • 它不跟踪庞大的分配(这有一个不同的指标)

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


感谢您的详细回答!此度量是否显示每个GC周期之间分配了多少字节?如果度量是在GC之前和之后计算的,这是否意味着在一个GC循环中清除了多少字节的Eden空间?你的答案中我还缺少什么,为什么这个指标相对于我的堆大小如此之高?(4GB堆)@EliaRohana这是一个计数器,我的意思是看代码-它只是不断地添加那些字节。@EliaRohana如果这回答了你的问题,你可以接受答案,顺便说一句。