-XX:-UseContainerSupport 和 -XX:MaxRAMPercentage 是否会自动计算其他 JVM 资源大小?

psy*_*tic 3 performance jvm docker

从 Java 8 更新 191 或更高版本,或 Java 10、11、12、13 等开始。我们有一个XX:+UseContainerSupport默认激活的选项,因此 JVM 可以读取容器内 RAM 和 CPU 的限制。通过设置,-XX:MaxRAMPercentage=90.0我可以告诉 JVM 我想要给 HEAP 多少可用 RAM 的百分比,但是其他 JVM 资源呢?像 GC、CodeCache、ClassLoading、Metaspace、DirectBuffers 等等?

JVM 是否也会调整其大小(分配堆后的剩余空间)以不超过可用 RAM?或者我仍然需要在每种情况下自己计算它,如下所示:

-XX:MetaspaceSize=64m -XX:ReservedCodeCacheSize=32m -XX:CompressedClassSpaceSize=16m -Xss256k 
Run Code Online (Sandbox Code Playgroud)

例如,如果创建一个具有 1G RAM 的容器并在其中运行 JVM -XX:MaxRAMPercentage=90.0,那么 HEAP 将占用 900m,而其他 JVM 内容将只有 100m,这 100m 是否会在所有需要的资源之间进行智能分配,例如设置XX:MaxMetaspaceSize(哪个默认情况下是无限的)?

apa*_*gin 7

链接问题的答案也参考了我的演讲,我在那里解释说 JDK 中所谓的“容器支持”只影响

  • 默认堆大小
  • 可用 CPU 的数量

因此,答案是否定的:JVM 不会调整其他内存区域的大小,也不会尝试以任何其他方式满足容器限制。您需要手动控制它们。