我使用spring 2.2.5,并通过spring启动执行器和Grafana监视我的应用程序指标。
我的应用程序打包了Docker(OpenJdk11),并配置了4GB内存。
我有长时间的gc暂停,大约有1-2秒,并且它与高jvm.gc.memory.allocated相关。
jvm.gc.memory.allocated指标有时达到30 to
有人能解释一下jvm.gc.memory.allocated指标吗?这是什么意思?
发布于 2020-09-16 17:35:53
这是一个相当奇怪的指标,如果你问我(在意义上说,它不是微不足道的掌握)。我们慢慢来。
首先,它是由micrometer
这里生成的,如果您阅读它的描述:
一个GC之后的年轻一代内存池的大小增加到下一个GC之前。
对你来说也没什么意义。我必须看一下计算它的代码,才能理解它的作用。
如果您了解一些关于GC和看看这段代码工作方式的基本知识,那么实际上事情相当简单。
分代垃圾收集器(如G1
)将堆划分为区域(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);
}
}
具体来说,它被定义为这里。
..。endsWith(“伊甸园空间”)
因此,这段代码获取了Used Space
在Eden Space
中GC循环前后的快照,计算delta
并将所有这些增量添加到单个值中。这就是jvm.gc.memory.allocated
。
这种类型衡量应用程序在其生存期内分配了多少,但只通过年轻空间分配。国际水文学组织,你应该仔细看,因为:
Shenandoah
不是这样的收集器)https://stackoverflow.com/questions/63880261
复制相似问题