Domyślny rozmiar Xmxsize w Javie 8 (maksymalny rozmiar sterty)

81

W dokumentacji Oracle znalazłem:

-Xmxsize Określa maksymalny rozmiar (w bajtach) puli alokacji pamięci w bajtach ... Wartość domyślna jest wybierana w czasie wykonywania na podstawie konfiguracji systemu.

Co oznacza konfiguracja systemu ?

Witalij
źródło
1
Oznacza to, że jeśli twój system ma 16 GB pamięci RAM, rozmiar będzie większy niż gdyby miał 512 MB.
JB Nizet
Dzięki, o ile większy?
Witalij
Poszukaj „maksymalnego rozmiaru sterty” tutaj
Nir Alfasi
3
>> Mniejsza o 1/4 pamięci fizycznej lub 1 GB. Dzięki, @alfasin.
Witalij
4
@Vitaly Wydaje się, że limit 1 Gb nie jest wystarczający -Xmx, przynajmniej w Javie 8, ponieważ w moim 64-bitowym systemie Linux, z całkowitą pamięcią 6 Gb, mam domyślnie jvm z -Xmx = 1,5 Gb.
user218867

Odpowiedzi:

144

Zależy to od implementacji i wersji, ale zwykle zależy od używanej maszyny wirtualnej (np. Klienta lub serwera, zobacz -clienti -serverparametry) oraz pamięci systemu.

Często clientwartość domyślna to 1/4 twojej pamięci fizycznej lub 1 GB (w zależności od tego, która z tych wartości jest mniejsza).

Również opcje konfiguracyjne Java (parametry wiersza poleceń) mogą być „outsourcowane” do zmiennych środowiskowych, w tym do zmiennych -Xmx, które mogą zmienić wartość domyślną (co oznacza określenie nowej wartości domyślnej). W szczególności JAVA_TOOL_OPTIONSzmienna środowiskowa jest sprawdzana przez wszystkie narzędzia Java i używana, jeśli istnieje (więcej szczegółów tutaj i tutaj ).

Możesz uruchomić następujące polecenie, aby zobaczyć wartości domyślne:

java -XX:+PrintFlagsFinal -version

Daje ci dłuuugą listę, -Xmxjest w MaxHeapSize, -Xmsjest w InitialHeapSize. Filtruj swoje wyjście (np |grep. W systemie Linux) lub zapisz je w pliku, abyś mógł w nim wyszukiwać.

icza
źródło
11
Jako mały dodatek możesz uruchomić, java -XX:+PrintCommandLineFlagsaby wydrukować rozmiary sterty (i inne informacje) wybrane przez JVM na podstawie aktualnych informacji o systemie
Cristian Vat
1
@CristianVat Tak, ale parametr jest taki -XX:+PrintFlagsFinal, że ten który zasugerowałeś u mnie nie działa. Dodając to do odpowiedzi.
icza
Racja, przepraszam -XX:+PrintFlagsFinalto najlepsza opcja, ponieważ po uwzględnieniu wszystkiego (w tym opcji ręcznych i ergonomii) powinna wyświetlać wszystkie informacje. Chociaż -XX:+PrintCommandLineFlagswydaje się, że działa na mojej JVM (może zależeć od dokładnej wersji)
Cristian Vat
2
W przypadku dużych pudełek ta praktyczna zasada „1/4 pamięci RAM” zdecydowanie się nie sprawdza. Na serwerze z 4 gniazdami, 64 GB na gniazdo (tj. 256 GB pamięci RAM), Xmx domyślnie wynosi ~ 32 GB. 32 GB może być związane z ograniczeniami CompressedOops, które również znajdują się w tym momencie.
FauxFaux
2
To wyświetla tylko wiersze związane z rozmiarem sterty:java -XX:+PrintFlagsFinal -version | grep HeapSize
user218867
37

Jak wspomniałeś, wartość domyślna -Xmxsize(Maximum HeapSize) zależy od konfiguracji systemu.

Java8 clientzajmuje większą z 1/64 pamięci fizycznej dla Xmssize(Minimalny rozmiar sterty) i mniejszą z 1/4 Twojej pamięci fizycznej dla -Xmxsize(Maksymalny rozmiar sterty).

Co oznacza, że ​​jeśli masz fizyczną pamięć 8 GB RAM, będziesz mieć Xmssizewiększą z 8 * (1/6) i mniejszą -Xmxsizejak 8 * (1/4).

Możesz sprawdzić domyślny rozmiar HeapSize za pomocą

W systemie Windows :

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

W systemie Linux :

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Te wartości domyślne można również zastąpić żądaną kwotą.

Sarat Chandra
źródło
2
Źródła
kisna
docs.oracle.com/javase/8/docs/technotes/guides/vm/ ... zgodnie z tym linkiem, domyślna wartość minimalna / początkowa to 1/64, a nie 1/6. „Większa z
1/64
15

Zaskakujące jest, że to pytanie nie ma ostatecznej udokumentowanej odpowiedzi. Być może inny punkt danych zapewniłby wartość innym szukającym odpowiedzi. W moich systemach z CentOS (6.8,7.3) i Java 8 (kompilacja 1.8.0_60-b27, serwer 64-bitowy):

Domyślna pamięć to 1/4 pamięci fizycznej, nie ograniczona do 1 GB.

Również -XX:+PrintFlagsFinalwydruki do STDERR, więc polecenie określające bieżącą domyślną pamięć przedstawioną przez innych powyżej powinno być zmodyfikowane do następującego:

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize

W systemie z 64 GB fizycznej pamięci RAM zwracane są następujące informacje:

uintx MaxHeapSize                                  := 16873684992      {product}
brianNotBob
źródło
W moim systemie z 16 GB pamięci RAM: 2069889024 = 2 GB.
david.perez
Windows 7 64-bitowy z 8 GB pamięci RAM: 32-bitowe maszyny JVM: 256 MB, 64-bitowe maszyny JVM: 2 GB
golimar
Wreszcie znalazłem dokumentację do tego: stackoverflow.com/a/56036202/32453
rogerdpack
2

Na mojej maszynie wirtualnej z systemem Ubuntu, z 1048 MB całkowitej pamięci RAM, java -XX:+PrintFlagsFinal -version | grep HeapSizewydrukowane: uintx MaxHeapSize := 266338304co stanowi około 266 MB i stanowi 1/4 mojej całkowitej pamięci RAM.

Binita Bharati
źródło
2
Wygląda na to, że OpenJDK i Oracle mają różne cechy - widzę, że OpenJDK używa 1/4 pamięci RAM jako -Xmx przez cały czas (nigdy mniejszy z 1/4 i 1 GB)
pogul
1

Od 8 maja 2019 r .:

Rozmiar sterty maszyny JVM zależy od konfiguracji systemu, co oznacza:

a) klient jvm vs serwer jvm

b) 32-bitowy vs 64-bitowy .

Spinki do mankietów:

1) aktualizacja z J2SE5.0: https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) krótka odpowiedź: https://docs.oracle.com/ javase / 8 / docs / technotes / guide / vm / gctuning / ergonomics.html
3) szczegółowa odpowiedź: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html# default_heap_size
4) klient kontra serwer: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

Podsumowanie: (Trudno to zrozumieć z powyższych linków. Podsumowując je tutaj)

1) Domyślny maksymalny rozmiar sterty dla jvm klienta to 256 MB (istnieje wyjątek, czytany z linków powyżej).

2) Domyślny maksymalny rozmiar sterty dla serwera jvm 32-bitowego to 1 GB, a 64-bitowego to 32 GB (znowu są tu wyjątki. Przeczytaj to z linków).

Więc domyślny maksymalny rozmiar sterty JVM jest: 256MB lub 1GB lub 32 GB w zależności od VM powyżej.

Vyshnav Ramesh Thrissur
źródło
1
Wreszcie linki do prawdziwego dokumentu wyjaśniającego, co się dzieje.
rogerdpack