重複したJavaランタイムオプション:優先順位は何ですか?


82

次のコマンドラインを検討する

java -Xms128m -Xms256m myapp.jar

JVMに適用される設定最小メモリ(Xmsオプション):128mまたは256m?


17
問題のタイプミスはありません。Xmsオプションは意図的に2回使用されます。これが質問の内容です
fabien7474 2010

回答:


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());
    }
}

2
+ 1-それらのペーパークリップをよりよく数えます:-)。真剣に、それらの曖昧な議論を通過しているものを変えることはロケット科学ではありません。
スティーブンC

4
さまざまな数のペーパークリップを試しています。最初のものへの切り替えが見つかりません
OganM 2017年

65

いつものように、ローカル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}

したがって、この場合、引数の2番目のインスタンス(2G)が優先され(少なくとも1.8では)、他のほとんどの最新バージョンでも同様に経験されています。


8
java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize、このようにすると、推測が簡単になります。
ryenus 2015

40

IBM JVMは、引数の右端のインスタンスを勝者として扱います。HotSpotなどとは話せません。

これを行うのは、バッチファイルから深くネストされたコマンドラインがあり、最後に追加することしかできず、それを勝者にしたい場合が多いためです。


21
説得する代わりに実際に質問に答えるための+1。
JimN 2014年


37

FTR、OpenJDK 1.7も、少なくとも-Xmsについては、右端の値をとるようです。


14
説得する代わりに実際に質問に答えるための+1。
JimN 2014年

1
CSSと同じように、
後者が

9

私はそれが2番目のものだと思います。引数は通常、次の順序で処理されます。

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

しかし、Java引数パーサーを書いているとしたら、引数の競合について文句を言うでしょう。


8

どの設定が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}

AdoptOpenJDK 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}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.