InitialRAMPercentage 不设置初始堆大小

Pop*_*los 4 java garbage-collection jvm

我们正在 Docker 容器中使用 OpenJDK 17.0.7 运行 Java 应用程序,并使用这些参数(这些参数仅与我的问题相关):
-XX:InitialRAMPercentage=75.0 -XX:MaxRAMPercentage=75.0 -XX:MaxMetaspaceSize=1G -XX:+UseG1GC

这是 JDK Mission Control 中的一张图片,显示了应用程序如何启动:

使用 InitialRAMPercentage 运行应用程序

您可以看到提交的大小始终不一样。它最初为 3GiB,然后增长到约 6GiB。

然后我将 VM Arguments 更改为使用 Xms/Xmx 而不是 RAMPercentage:
-Xms6G -Xmx6G -XX:MaxMetaspaceSize=1G -XX:+UseG1GC

现在我看到了我期望看到的图片 - 从启动开始承诺的大小等于 6GiB: 使用 Xms/XMx 运行应用程序

这是 InitialRAMPercentage 的预期行为吗?它的工作方式不应该与 Xms 相同吗?我错过了什么吗?

apa*_*gin 6

一个常见的误解是初始堆大小是最小堆大小。它们实际上是不同的,可以单独配置:-XX:InitialHeapSizevs. -XX:MinHeapSize.

在 JDK 17 中,是将和-Xms设置为相同值的快捷方式。相反,仅影响,因此堆可能会缩小到初始大小以下。InitialHeapSizeMinHeapSize-XX:InitialRAMPercentageInitialHeapSize

如果您想防止堆在运行时调整大小,请使用 禁用堆收缩-XX:MaxHeapFreeRatio=100,或完全禁用自适应大小策略:-XX:-UseAdaptiveSizePolicy

注意:-XX:MinRAMPercentage没有帮助。它的名称令人困惑:参数 configures MaxHeapSize,而不是MinHeapSize- 请参阅JDK-8278492