Spring Actuator 的 "jvm.memory.max" 指标与 Runtime.getRuntime().maxMemory() 不匹配

Mismatch between Spring Actuator's "jvm.memory.max" metric and Runtime.getRuntime().maxMemory()

我正在试用 Spring Boot Actuator 并查看“/actuator/metrics/jvm.memory.max”端点。

我也是 运行 我的 Spring 启动应用程序,具有以下 JVM 选项:

-Xmx104m

我创建了一个端点(“/memory”,其中 returns 应用程序的总内存、可用内存、已用内存和最大内存。我为此使用了 Runtime.getRuntime().getXXX() 方法。

我的问题是值 Springboot 的 "jvm.memory.max" 以字节为单位向我显示的值与 -Xmx 值以及“/memory”端点向我显示的内容不匹配。

知道为什么会出现这种不匹配吗?

Spring Boot 使用 Micrometer 来支持指标。 jvm.memory.max 指标由 Mirometer 的 JvmMemoryMetrics class 使用 MemoryPoolMXBean.getUsage().getMax() 生成。

MemoyPoolMXBean 公开有关堆内存和非堆内存的信息,而 Micrometer 使用 jvm.memory.max 指标上的标签将这些信息分开。在问题中显示的输出中,该值是堆内存和非堆内存的组合,这就是为什么它与使用 -Xmx.

配置的堆特定值不同的原因

您可以使用指标和查询参数深入了解指标。这在 Actuator 的 documentation. For example, to get the max heap memory, you would use http://localhost:9001/actuator/metrics/jvm.memory.max?tag=area:heap.

中有描述