次のコマンドラインを検討する
Java -Xms128m -Xms256m myapp.jar
JVM最小メモリ(Xms
オプション)に適用される設定:128mまたは256m?
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());
}
}
いつものように、ローカル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で)。これは、他のほとんどの最新バージョンでも同様です。
IBM JVMは、引数の右端のインスタンスを勝者として扱います。 HotSpotなどと話すことができません。
多くの場合、最後にしか追加できないバッチファイルのコマンドラインが深くネストされており、それを勝者にしたいので、これを行います。
FTR、OpenJDK 1.7は、少なくとも-Xmsについては、最も右の値を取るようです。
私はそれが2番目のものに違いない。引数は通常、次の順序で処理されます。
for( int i=0; i<argc; i++ ) {
process_argument(argv[i]);
}
しかし、もしJava引数パーサーを書いているなら、矛盾する引数について文句を言うでしょう。