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
)将堆划分为 regions(young
和 old
).新对象的分配发生在年轻区域(除非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
不是这样的收集器)
我正在使用 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
)将堆划分为 regions(young
和 old
).新对象的分配发生在年轻区域(除非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
不是这样的收集器)