Jakie są parametry -Xms i -Xmx podczas uruchamiania JVM?

1006

Wyjaśnij użycie Xmsi Xmxparametry w JVM. Jakie są dla nich wartości domyślne?

Pankaj
źródło
2
podczas używania -Xmx128m -Xms64mmoże osiągać szczyt wokół 275mpamięci OZE, ale podczas używania -Xmx128m -Xms128mmoże osiągać szczyt wokół 550mpamięci OZE Korzystanie z Java 8 Najlepiej jest podkreślić GC i spojrzeć na to, co się dzieje ...
Christophe Roussy

Odpowiedzi:

1358

Flaga Xmxokreśla maksymalną pulę alokacji pamięci dla wirtualnej maszyny Java (JVM), a Xmsokreśla początkową pulę alokacji pamięci.

Oznacza to, że twoja JVM zostanie uruchomiona z Xmsilością pamięci i będzie w stanie wykorzystać maksymalną Xmxilość pamięci. Na przykład uruchomienie maszyny JVM jak poniżej spowoduje uruchomienie jej z 256 MB pamięci i pozwoli procesowi wykorzystać do 2048 MB pamięci:

java -Xms256m -Xmx2048m

Flaga pamięci może być również określona w różnych rozmiarach, takich jak kilobajty, megabajty i tak dalej.

-Xmx1024k
-Xmx512m
-Xmx8g

XmsFlaga ma wartość domyślną, a Xmxzazwyczaj ma domyślną wartość 256 MB. Częstym zastosowaniem tych flag jest, gdy napotkasz java.lang.OutOfMemoryError.

Korzystając z tych ustawień, należy pamiętać, że te ustawienia dotyczą sterty maszyny JVM i że maszyna JVM może / będzie zużywać więcej pamięci niż tylko rozmiar przydzielony do sterty. Z dokumentacji Oracle :

Pamiętaj, że JVM zużywa więcej pamięci niż tylko stertę. Na przykład metody Java, stosy wątków i uchwyty rodzime są przydzielane w pamięci oddzielnie od sterty, a także wewnętrzne struktury danych JVM.

heksacyjanid
źródło
12
To tak, jakby kiedy użycie pamięci przekroczyło Xmx, otrzymujemy jvm z wyjątku pamięci.
Pankaj,
59
Tak, to jest poprawne. Gdy próbuje to przekroczyć, może zbierać śmieci, aby zwolnić wystarczającą ilość pamięci. Jeśli nadal nie ma wystarczającej ilości pamięci do zaspokojenia żądania, a sterty osiągnęły już maksymalny rozmiar, OutOfMemoryErrornastąpi błąd.
David Conrad,
2
Gdy korzystam ze środowiska ForkJoin, mój komputer ulega awarii, ponieważ zajmuje zbyt dużo pamięci. Czy to możliwe, że w OpenJDK domyślnie nie ma twardego limitu pamięci?
Christophe De Troyer
6
Jak wyjaśniono w Czy Czy Java -Xmx 1G oznacza 1 GB czy 2 ^ 30 B? , jednoznacznym sposobem wyrażenia ilości pamięci, od której zaczynasz, -Xms256mjest „256 MiB”, a nie „256 MB”, ponieważ korzysta z mocy binarnych zamiast dziesięciu. Zobacz en.wikipedia.org/wiki/Binary_prefix . Ponadto, ponieważ pewna niepotrzebna przestrzeń jest zarezerwowana na dodatkową pulę przestrzeni Survivor, ilość dostępnej pamięci, zgodnie z nią, Runtime.getRuntime().maxMemory()jest mniejsza niż wartość określona przez -Xmx
nealmcb
1
Przydatny przewodnik po typowych błędach związanych z rozmiarem stosu: blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size
ctrlplusb
313

Uruchom polecenie, java -Xa otrzymasz listę wszystkich -Xopcji:

C:\Users\Admin>java -X
-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                      set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                      append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                      prepend in front of bootstrap class path
-Xdiag            show additional diagnostic messages
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size.........................
-Xmx<size>        set maximum Java heap size.........................
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.
-XshowSettings    show all settings and continue
-XshowSettings:all         show all settings and continue
-XshowSettings:vm          show all vm related settings and continue
-XshowSettings:properties  show all property settings and continue
-XshowSettings:locale      show all locale related settings and continue

Opcje -X są niestandardowe i mogą ulec zmianie bez powiadomienia.

Mam nadzieję, że pomoże ci to zrozumieć Xms, Xmxa także wiele innych rzeczy, które są najważniejsze. :)

Rupesh Yadav
źródło
1
Nauczyłem się dzisiaj nowego polecenia, dzięki @RupeshYadav
jumping_monkey
18

Możesz to określić w swoim IDE. Na przykład dla argumentów Eclipse w Uruchamianie konfiguracjiVM . Możesz wpisać -Xmx800m -Xms500mjako

Wpisz opis zdjęcia tutaj

Mehrez BEN MOHAMED
źródło
W RubyMine w OSX znajduje się w menu Pomoc> Edytuj niestandardowe opcje maszyny wirtualnej.
Jon Schneider,
8
To nie odpowiada na pytanie. Pytanie dotyczy tego, do czego służą, a nie jak je ustawić.
Captain Man,
@Hearen Jak oddzielić w intellij ??
13

Samo pytanie zostało już poruszone powyżej. Po prostu dodaje część wartości domyślnych.

Zgodnie z http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

Domyślna wartość Xmx będzie zależeć od platformy i ilości pamięci dostępnej w systemie.

Abhishek Aich
źródło
8
W przypadku innych maszyn JVM (oprócz JRockit) zapoznaj się z tym postem, aby określić domyślne wartości Xmx / Xms Twojej maszyny JVM: stackoverflow.com/questions/4667483/…
Ogre Psalm33
3

-Xms początkowy rozmiar sterty dla uruchomienia, jednak podczas procesu roboczego rozmiar sterty może być mniejszy niż -Xms z powodu braku aktywności użytkowników lub iteracji GC. To nie jest minimalny wymagany rozmiar sterty.

-Xmx maksymalny rozmiar sterty

leniwy
źródło