繁体   English   中英

jvm 堆 memory 选项 `XX:MaxRAMPercentage` 是否仅对 dockerized 应用程序有效?

[英]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 的数量,这反过来意味着以下内容:

  1. 对于绝大多数 java 应用程序,-XX:MaxRAMPercentage 的值应该约为 80-95,因为我们想消耗所有容器 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM