【问题标题】:Duplicated Java runtime options : what is the order of preference?重复的 Java 运行时选项:优先顺序是什么?
【发布时间】:2010-04-29 20:56:48
【问题描述】:

考虑下面的命令行

java -Xms128m -Xms256m myapp.jar

JVM 最小内存(Xms 选项)适用哪些设置:128m 或 256m?

【问题讨论】:

  • 没有错字。 Xms 选项被故意使用了两次。这是问题的实质

标签: java jvm jvm-arguments java-opts


【解决方案1】:

与往常一样,检查本地 JVM 的具体实现,但这里有一种无需编码即可从命令行快速检查的方法。

> java -version; java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize

java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
uintx MaxHeapSize         := 2147483648        {product}

所以你会在这种情况下看到,参数的第二个实例 (2G) 是优先的(至少在 1.8 中),这也是我对大多数其他现代版本的经验。

【讨论】:

  • java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize,这样更容易推断。
【解决方案2】:

哪些设置适用于 JVM 最小内存?

在下面列出的各种 Java 版本中,“获胜者”是参数列表中最右边的值。正如其他人所指出的那样,依赖此不是一个好主意,但也许这是共享的有用信息。

Java 1.8.0_172

~ $ java8
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
    uintx MaxHeapSize                              := 4219469824                          {product}

Java 11.0.3

~ $ java11
java version "11.0.3" 2019-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
   size_t MaxHeapSize                              = 4219469824                                {product} {command line}

OpenJDK 12.0.1

~ $ java12
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment (build 12.0.1+12)
OpenJDK 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
   size_t MaxHeapSize                              = 4219469824                                {product} {command line}

采用OpenJDK 12.0.1

~ $ java12a
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 12.0.1+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 12.0.1+12, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
   size_t MaxHeapSize                              = 4219469824                                {product} {command line}

OpenJDK 13-ea

~ $ java13
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+22)
OpenJDK 64-Bit Server VM (build 13-ea+22, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
   size_t MaxHeapSize                              = 4219469824                                {product} {command line}

【讨论】:

    【解决方案3】:

    FTR,OpenJDK 1.7 似乎也取了最右边的值,至少对于 -Xms。

    【讨论】:

    • +1 用于实际回答问题而不是夸夸其谈。
    • 跟CSS一样,靠后胜出
    【解决方案4】:

    取决于 JVM,可能是版本……甚至可能是您当时桌上有多少回形针。它甚至可能不起作用。不要那样做。

    如果由于某种原因它超出了您的控制范围,请以与运行 jar 相同的方式编译和运行它。但请注意,依赖选项的顺序是一个非常糟糕的主意。

    public class TotalMemory
    {
        public static void main(String[] args)
        {
             System.out.println("Total Memory: "+Runtime.getRuntime().totalMemory());
             System.out.println("Free Memory: "+Runtime.getRuntime().freeMemory());
        }
    }
    

    【讨论】:

    • +1 - 更好地计算那些回形针:-)。说真的,改变那些模棱两可的论点并不是火箭科学。
    • 一直在尝试不同数量的回形针。找不到切换到第一个
    【解决方案5】:

    IBM JVM 将参数的最右边实例视为获胜者。我无法与 HotSpot 等对话。

    我们这样做是因为批处理文件中经常有深度嵌套的命令行,人们只能在其中添加到末尾,并希望使其成为赢家。

    【讨论】:

    【解决方案6】:

    我敢打赌这是第二个。参数通常按顺序处理:

    for( int i=0; i<argc; i++ ) {
      process_argument(argv[i]);
    }
    

    但如果我正在编写 java 参数解析器,我会抱怨参数冲突。

    【讨论】:

      【解决方案7】:

      我的实验表明取最大值为xmx

      因此,如果您传入-xmx4g -xmx1g,它将需要4t,并且 如果你传入-xmx1g -xmx4g,它仍然需要4g

      【讨论】:

      • 这不是我在 AdoptOpenJDK-11.0.11+9 中看到的行为,使用 java -version; java -Xmx2G -Xmx1G -XX:+PrintFlagsFinal 2&gt;/dev/null | grep MaxHeapSize
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 2021-08-18
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多