Spring boot spring boot 2执行器jvm.gc.memory.allocated Metric
我正在使用SpringBoot2.2.5,并通过SpringBootActuator和Grafana监控我的应用程序指标 我的应用程序使用Docker(OpenJdk11)打包,并配置4GB内存 我有长时间的gc暂停,大约1-2秒,它与highjvm.gc.memory.allocated相关 jvm.gc.memory.allocated指标有时会达到30GBSpring 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的度量吗?这是什么意思?如果你问我的话,这是一个相当奇怪的指标(从某种意义
有人能解释一下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如果这回答了你的问题,你可以接受答案,顺便说一句。