Doppelte Java-Laufzeitoptionen: Wie ist die Reihenfolge der Präferenzen?

81

Berücksichtigung der folgenden Befehlszeile

java -Xms128m -Xms256m myapp.jar

Welche Einstellungen gelten für JVM-Mindestspeicher ( XmsOption): 128 m oder 256 m?

fabien7474
quelle
16
Kein Tippfehler in Frage. Xms-Optionen werden absichtlich zweimal verwendet. Dies ist der
Inhalt

Antworten:

28

Hängt von der JVM ab, vielleicht von der Version ... vielleicht sogar davon, wie viele Büroklammern Sie gerade auf Ihrem Schreibtisch haben. Es könnte nicht einmal funktionieren. Tu das nicht.

Wenn es aus irgendeinem Grund außerhalb Ihrer Kontrolle liegt, kompilieren Sie es und führen Sie es auf die gleiche Weise aus, wie Sie Ihr Glas ausführen würden. Aber seien Sie gewarnt, es ist eine wirklich schlechte Idee, sich auf die Reihenfolge der Optionen zu verlassen.

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());
    }
}
cHao
quelle
2
+1 - zähle besser diese Büroklammern :-). Im Ernst, es ist keine Raketenwissenschaft, das zu ändern, was diese zweideutigen Argumente übergibt.
Stephen C
4
habe es mit unterschiedlicher Anzahl von Büroklammern versucht. kann nicht zum ersten wechseln
OganM
65

Überprüfen Sie wie immer die spezifische Implementierung Ihrer lokalen JVM. Hier finden Sie jedoch eine schnelle Möglichkeit, dies über die Befehlszeile zu überprüfen, ohne codieren zu müssen.

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

Sie werden also in diesem Fall sehen, dass die zweite Instanz des Arguments (2G) Vorrang hat (zumindest in 1.8), und das war meine Erfahrung mit den meisten anderen modernen Versionen.

David Hergert
quelle
8
java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSizeAuf diese Weise ist es einfacher abzuleiten.
Ryenus
40

Die IBM JVM behandelt die Instanz eines Arguments ganz rechts als Gewinner. Ich kann nicht mit HotSpot usw. sprechen.

Wir tun dies, da es häufig tief verschachtelte Befehlszeilen aus Batch-Dateien gibt, die nur am Ende hinzugefügt werden können und die zum Gewinner werden möchten.

Trent Gray-Donald
quelle
21
+1 für die tatsächliche Beantwortung der Frage anstelle von Pontifikat.
JimN
37

FTR, OpenJDK 1.7 scheint ebenfalls den Wert ganz rechts anzunehmen, zumindest für -Xms.

Marcin Owsiany
quelle
14
+1 für die tatsächliche Beantwortung der Frage anstelle von Pontifikat.
JimN
1
Genau wie CSS gewinnt der spätere
Ryenus
9

Ich wette, es ist der zweite. Argumente werden normalerweise in der folgenden Reihenfolge verarbeitet:

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

Aber wenn ich einen Java-Argument-Parser schreiben würde, würde ich mich über widersprüchliche Argumente beschweren.

Vladimir Dyuzhev
quelle
7

Welche Einstellungen gelten für JVM Minimum Memory?

In den verschiedenen unten aufgeführten Java-Versionen ist der "Gewinner" der am weitesten rechts stehende Wert in der Argumentliste. Wie andere betont haben, ist es keine gute Idee, sich darauf zu verlassen, aber vielleicht sind dies nützliche Informationen, um sie trotzdem zu teilen.

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