Options d’exécution Java dupliquées: quel est l’ordre de préférence?

Considérant la ligne de commande suivante

java -Xms128m -Xms256m myapp.jar 

Quels parameters s’appliqueront à la mémoire JVM Minimum (option Xms ): 128 m ou 256 m?

Cela dépend de la JVM, peut-être de la version … peut-être même du nombre de trombones que vous avez sur votre bureau à la fois. Cela pourrait même ne pas marcher. Ne fais pas ça.

Si, pour une raison quelconque, vous ne contrôlez rien, comstackz-le et exécutez-le comme vous le feriez avec votre JAR. Mais soyez averti, compter sur l’ordre des options est une très mauvaise idée.

 public class TotalMemory { public static void main(Ssortingng[] args) { System.out.println("Total Memory: "+Runtime.getRuntime().totalMemory()); System.out.println("Free Memory: "+Runtime.getRuntime().freeMemory()); } } 

Comme toujours, vérifiez l’implémentation spécifique de votre JVM locale, mais voici un moyen rapide de vérifier depuis la ligne de commande sans avoir à coder.

 > 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} 

Donc, vous verrez dans ce cas, la deuxième instance de l’argument (2G) est ce qui a préséance (au moins en 1.8) et cela a été mon expérience avec la plupart des autres versions modernes.

La machine virtuelle Java d’IBM traite l’instance la plus à droite d’un argument comme gagnant. Je ne peux pas parler à HotSpot, etc.

Nous faisons cela car il existe souvent des lignes de commande profondément nestedes à partir de fichiers de commandes, où les utilisateurs ne peuvent qu’append à la fin et qui veulent en faire le gagnant.

FTR, OpenJDK 1.7 semble également prendre la valeur la plus à droite, au moins pour -Xms.

Je parie que c’est le deuxième. Les arguments sont généralement traités dans l’ordre:

 for( int i=0; i 

Mais si j'écrivais un parsingur d'arguments java, je me plaindrais d'arguments contradictoires.