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指标?这是什么意思 ?
如果你问我的话,这是一个相当奇怪的指标(从某种意义上说,掌握它并不简单)。我们慢慢来吧。
首先,它是由micrometer
此处生成的,如果您阅读了它的描述:
在一次 GC 之后到下一次 GC 之前,随着年轻代内存池大小的增加而增加
这对你来说可能也没什么意义。我必须查看计算它的代码,才能理解它的作用。
如果您了解 GC 工作原理的一些基本知识并查看此代码,实际上事情相当简单。
分代垃圾收集器(如G1
)将堆划分为区域(young
和old
)。新对象的分配发生在 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 Space
delta
jvm.gc.memory.allocated
这种方法测量应用程序在其生命周期内分配了多少空间,但只能通过年轻空间分配。恕我直言,你应该仔细看看它,因为:
它不跟踪巨大的分配(对此有一个不同的指标)
它仅适用于分代垃圾收集器(Shenandoah
例如不是这样的收集器)
归档时间: |
|
查看次数: |
3425 次 |
最近记录: |