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 ?
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 ?
-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.Odpowiedzi:
Zależy to od implementacji i wersji, ale zwykle zależy od używanej maszyny wirtualnej (np. Klienta lub serwera, zobacz
-client
i-server
parametry) oraz pamięci systemu.Często
client
wartość 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ściJAVA_TOOL_OPTIONS
zmienna ś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:
Daje ci dłuuugą listę,
-Xmx
jest wMaxHeapSize
,-Xms
jest wInitialHeapSize
. Filtruj swoje wyjście (np|grep
. W systemie Linux) lub zapisz je w pliku, abyś mógł w nim wyszukiwać.źródło
java -XX:+PrintCommandLineFlags
aby wydrukować rozmiary sterty (i inne informacje) wybrane przez JVM na podstawie aktualnych informacji o systemie-XX:+PrintFlagsFinal
, że ten który zasugerowałeś u mnie nie działa. Dodając to do odpowiedzi.-XX:+PrintFlagsFinal
to najlepsza opcja, ponieważ po uwzględnieniu wszystkiego (w tym opcji ręcznych i ergonomii) powinna wyświetlać wszystkie informacje. Chociaż-XX:+PrintCommandLineFlags
wydaje się, że działa na mojej JVM (może zależeć od dokładnej wersji)java -XX:+PrintFlagsFinal -version | grep HeapSize
Jak wspomniałeś, wartość domyślna
-Xmxsize
(Maximum HeapSize) zależy od konfiguracji systemu.Java8
client
zajmuje większą z 1/64 pamięci fizycznej dlaXmssize
(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ć
Xmssize
większą z 8 * (1/6) i mniejszą-Xmxsize
jak 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ą.
źródło
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:+PrintFlagsFinal
wydruki 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}
źródło
Na mojej maszynie wirtualnej z systemem Ubuntu, z 1048 MB całkowitej pamięci RAM,
java -XX:+PrintFlagsFinal -version | grep HeapSize
wydrukowane:uintx MaxHeapSize := 266338304
co stanowi około 266 MB i stanowi 1/4 mojej całkowitej pamięci RAM.źródło
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.
źródło