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

考虑下面的命令行

java -Xms128m -Xms256m myapp.jar 

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

取决于JVM,也许是版本…也许甚至在你的桌上有多less个回形针。 它甚至可能不工作。 不要这样做。

如果出于某种原因无法控制,请按照运行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()); } } 

IBM JVM将参数的最右侧实例视为优胜者。 我不能说HotSpot等。

我们这样做是因为从batch file中经常存在深层嵌套的命令行,人们只能将其添加到最后,并且想要成为赢家。

像往常一样,检查你本地的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)的第二个实例是优先的(至less在1.8),这也是我对其他大多数现代版本的经验。

FTR,OpenJDK 1.7似乎也采取最右边的价值,至less为-XMS。

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

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

但是,如果我正在写java参数parsing器,我会抱怨冲突的参数。