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?


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());
    }
}

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.


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


37

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


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.


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}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.