web-dev-qa-db-fra.com

Dupliqué Java options d'exécution: quel est l'ordre de préférence?

Considérant la ligne de commande suivante

Java -Xms128m -Xms256m myapp.jar

Quels paramètres s'appliquent à la mémoire JVM minimale (option Xms): 128 m ou 256 m?

75
fabien7474

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 à l'époque. Cela pourrait même ne pas fonctionner. Ne fais pas ça.

Si c'est hors de votre contrôle pour une raison quelconque, compilez-le et exécutez-le de la même manière que vous exécuteriez votre bocal. Mais attention, se fier à l'ordre des options est une très mauvaise idée.

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

Comme toujours, vérifiez l'implémentation spécifique de votre JVM locale, mais voici un moyen rapide de vérifier à partir de 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 la priorité (au moins en 1.8) et c'est aussi mon expérience avec la plupart des autres versions modernes.

52
David Hergert

IBM JVM traite l'instance la plus à droite d'un argument comme la gagnante. Je ne peux pas parler à HotSpot, etc.

Nous le faisons car il existe souvent des lignes de commande profondément imbriquées à partir de fichiers de commandes où les gens ne peuvent ajouter qu'à la fin et veulent en faire le gagnant.

37
Trent Gray-Donald

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

33
Marcin Owsiany

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

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

Mais si j'écrivais Java, je me plaindrais d'arguments contradictoires.

9
Vladimir Dyuzhev