web-dev-qa-db-ja.com

重複Javaランタイムオプション:優先順位は?

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

Java -Xms128m -Xms256m myapp.jar

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

69
fabien7474

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

いつものように、ローカル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で)。これは、他のほとんどの最新バージョンでも同様です。

52
David Hergert

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

多くの場合、最後にしか追加できないバッチファイルのコマンドラインが深くネストされており、それを勝者にしたいので、これを行います。

37

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

33
Marcin Owsiany

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

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

しかし、もしJava引数パーサーを書いているなら、矛盾する引数について文句を言うでしょう。

9