[英]Is jvm heap memory option `XX:MaxRAMPercentage` only valid for dockerized applications?
根据链接https://bugs.openjdk.org/browse/JDK-8186248
XX:MaxRAMPercentage
的目的是允许更灵活地选择可用 RAM 的堆百分比,即我们需要通过限制容器 memory 来控制 memory 消耗的 memory 的数量,这反过来意味着以下内容:
这是否意味着如果应用程序未在容器中运行,则不应使用 -XX:MaxRAMPercentage? 我想如果不涉及容器,那么也可以使用这些选项。
谁能澄清一下?
不存在阻止您在没有容器的情况下使用此选项的技术障碍。 当我使用以下程序时
import com.sun.management.OperatingSystemMXBean;
import static java.lang.management.ManagementFactory.*;
public class PrintMaxRAM {
public static void main(String[] args) {
long maxHeap = getMemoryMXBean().getHeapMemoryUsage().getMax();
long maxRAM = getPlatformMXBean(OperatingSystemMXBean.class)
.getTotalMemorySize();
System.out.println(maxHeap + " (" + maxHeap * 100 / maxRAM + "%)");
}
}
喜欢
jdk-17\bin\java PrintMaxRAM.java
它打印
3737124864 (25%)
在我的机器上(Windows,没有虚拟化)。 当我使用
jdk-17\bin\java -XX:MaxRAMPercentage=75 PrintMaxRAM.java
相反,它按预期打印:
11207180288 (75%)
(显然块大小有一些舍入,所以字节数不完全是三倍)
因此,您是否“应该”使用此选项取决于您自己(我们您的客户)的意图。
当您在非虚拟化系统上运行应用程序以及未知程序时,您可能希望限制绝对最大 memory 消耗,例如通过-Xmx
,并为未知程序保留未知剩余量 memory。
当您在专用容器中运行应用程序时,连同一组已知的程序或根本没有其他程序,您很可能想要指定与容器的 memory 相关的最大数量 memory,因此当您想要更改可用的memory,只需要重新配置容器即可,不需要适配所有程序的启动配置。
所以这不是对错的问题,而是实际用例的问题。 例如,要为所需的 memory 指定绝对上限,您必须知道实际应用程序。 这就是为什么即使不在容器内运行,默认配置也是一个相对值(在某些环境中),因为 JVM 无法预测任意应用程序的有用绝对值。
例如,如果您没有使用容器,但整个硬件都专用于运行单个程序,那么为该程序使用例如-XX:MaxRAMPercentage=90
是非常有意义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.