Zduplikowane opcje środowiska wykonawczego Java: jaka jest kolejność preferencji?

82

Biorąc pod uwagę następujący wiersz poleceń

java -Xms128m -Xms256m myapp.jar

Jakie ustawienia będą dotyczyć maszyny JVM Minimalna pamięć ( Xmsopcja): 128 m czy 256 m?

fabien7474
źródło
17
Bez literówki. Opcje Xms są używane celowo dwukrotnie. To jest istota pytania
fabien7474

Odpowiedzi:

28

Zależy od JVM, być może wersji ... może nawet od tego, ile spinaczy masz na biurku w tym czasie. To może nawet nie zadziałać. Nie rób tego.

Jeśli z jakiegoś powodu nie masz na to wpływu, skompiluj i uruchom w ten sam sposób, w jaki uruchamiasz jar. Ale ostrzegam, poleganie na kolejności opcji to naprawdę zły pomysł.

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
źródło
2
+1 - lepiej policz te spinacze :-). Poważnie, nie jest fizyką rakietową zmienianie tego, co mija te dwuznaczne argumenty.
Stephen C
4
próbowałem z różną liczbą spinaczy do papieru. nie mogę znaleźć przełącznika na pierwszy
OganM
65

Jak zawsze, sprawdź konkretną implementację lokalnej maszyny JVM, ale tutaj jest szybki sposób na sprawdzenie z wiersza poleceń bez konieczności kodowania.

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

Więc zobaczysz w tym przypadku, drugie wystąpienie argumentu (2G) ma pierwszeństwo (przynajmniej w 1.8) i to było również moje doświadczenie z większością innych nowoczesnych wersji.

David Hergert
źródło
8
java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSizew ten sposób łatwiej jest wywnioskować.
ryenus
40

IBM JVM traktuje skrajną prawą instancję argumentu jako zwycięzcę. Nie mogę rozmawiać z HotSpotem itp.

Robimy to, ponieważ często istnieją głęboko zagnieżdżone wiersze poleceń z plików wsadowych, w których ludzie mogą dodawać tylko na końcu i chcą, aby wygrał.

Trent Gray-Donald
źródło
21
+1 za faktyczną odpowiedź na pytanie zamiast pontyfikowania.
JimN
37

FTR, OpenJDK 1.7 również wydaje się przyjmować skrajną prawą wartość, przynajmniej dla -Xms.

Marcin Owsiany
źródło
14
+1 za faktyczną odpowiedź na pytanie zamiast pontyfikowania.
JimN
1
podobnie jak CSS, późniejszy wygrywa
ryenus
9

Założę się, że to drugi. Argumenty są zwykle przetwarzane w kolejności:

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

Ale gdybym pisał parser argumentów Java, narzekałbym na sprzeczne argumenty.

Vladimir Dyuzhev
źródło
8

Jakie ustawienia będą dotyczyły minimalnej pamięci maszyny JVM?

W różnych wersjach języka Java wymienionych poniżej „zwycięzca” jest najbardziej po prawej stronie na liście argumentów. Jak zauważyli inni, poleganie na tym nie jest dobrym pomysłem, ale być może warto się tym podzielić.

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
źródło