重复的Java运行时选项:首选顺序是什么?

fab*_*474 72 java jvm jvm-arguments java-opts

考虑以下命令行

java -Xms128m -Xms256m myapp.jar
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ert 55

与往常一样,检查本地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}
Run Code Online (Sandbox Code Playgroud)

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

  • `java -Xmx1G -XX:+ PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize`,这样可以更容易推断出来. (7认同)

Tre*_*ald 37

IBM JVM将最右边的参数实例视为获胜者.我不能和HotSpot等说话.

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

  • +1实际回答问题而不是pontificating. (19认同)

Mar*_*any 34

FTR,OpenJDK 1.7似乎也取得了最合适的价值,至少对于-Xms而言.

  • +1实际回答问题而不是pontificating. (13认同)

cHa*_*Hao 28

取决于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());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一直在尝试使用不同数量的纸夹.找不到切换到第一个 (3认同)
  • +1 - 更好地计算那些回形针:-).说真的,改变通过那些含糊不清的论点的东西并不是火箭科学. (2认同)

kaa*_*aan 11

哪些设置将适用于 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}
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)

采用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}
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)


Vla*_*hev 9

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

for( int i=0; i<argc; i++ ) {
  process_argument(argv[i]);
}
Run Code Online (Sandbox Code Playgroud)

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