Jeśli pominę tę -Xmxn
opcję w wierszu polecenia Java, zostanie użyta wartość domyślna. Według dokumentacji Java
„wartość domyślna jest wybierana w czasie wykonywania na podstawie konfiguracji systemu”
Jakie ustawienia konfiguracji systemu wpływają na wartość domyślną?
java
heap
heap-memory
Richard Dorman
źródło
źródło
Odpowiedzi:
W systemie Windows można użyć następującego polecenia, aby dowiedzieć się o wartościach domyślnych w systemie, w którym działają aplikacje.
Poszukaj opcji
MaxHeapSize
(dla-Xmx
) iInitialHeapSize
dla-Xms
.W systemie Unix / Linux możesz to zrobić
Uważam, że wynikowy wynik jest w bajtach.
źródło
InitialHeapSize = 262803264
aMaxHeapSize = 4206886912
która wynosi około 256 MB i 4 GB , jeśli się nie mylę. Czy to oznacza, że każda JVM zaczyna się tak, jakby była uruchamiana z-Xms256m -Xmx4g
opcjami?java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
pomija długi tekst „użycia” nastderr
.Dla Java SE 5: Według Garbage Collector Ergonomics [Oracle] :
AKTUALIZACJA:
Jak zauważył Tom Anderson w swoim komentarzu, powyższe dotyczy maszyn klasy serwerowej. Z ergonomii w maszynie wirtualnej Java 5.0 5.0 :
źródło
Java 8 trwa dłużej niż 1 / 64th swojej pamięci fizycznej dla Xmssize (minimalna HeapSize) i mniej niż 1/4 swojej fizycznej pamięci dla -Xmxsize (maksymalny HeapSize).
Możesz sprawdzić domyślny rozmiar sterty Java, wykonując:
W systemie Windows :
W systemie Linux :
Maszyna znajduje się w pamięci fizycznej i wersja Java.
źródło
Zostało to zmienione w aktualizacji 18 Java 6 .
Zakładając, że mamy więcej niż 1 GB pamięci fizycznej (w dzisiejszych czasach dość powszechne), zawsze jest to jedna czwarta pamięci fizycznej dla serwera vm.
źródło
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Ernesto ma rację. Według linku, który opublikował [1]:
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
źródło
W przypadku IBM JVM polecenie jest następujące:
Aby uzyskać więcej informacji na temat pakietu IBM SDK dla Java 8: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html ? lang = en
źródło
Wreszcie!
Od wersji Java 8u191 dostępne są teraz następujące opcje:
które mogą być użyte do ustalenia wielkości stosu jako procent użytecznej fizycznej pamięci RAM. (który jest taki sam, jak pamięć RAM zainstalowana mniej, niż używa jądro).
Aby uzyskać więcej informacji, zobacz Informacje o wersji Java8 u191 . Zauważ, że opcje są wymienione pod nagłówkiem Docker, ale w rzeczywistości mają zastosowanie niezależnie od tego, czy jesteś w środowisku Docker, czy w tradycyjnym środowisku.
Domyślna wartość
MaxRAMPercentage
to 25%. To jest bardzo konserwatywne.Moja własna zasada: jeśli Twój host jest mniej więcej poświęcony uruchamianiu danej aplikacji Java, możesz bez problemu dramatycznie wzrosnąć. Jeśli korzystasz z systemu Linux, korzystasz tylko ze standardowych demonów i zainstalowałeś pamięć RAM od około 1 Gb i więcej, nie wahałbym się użyć 75% na stertę JVM. Ponownie pamiętaj, że jest to 75% dostępnej pamięci RAM , a nie zainstalowana pamięć RAM . Pozostały procesy lądowe innych użytkowników, które mogą być uruchomione na hoście, oraz inne rodzaje pamięci, których potrzebuje JVM (np. Do stosu). Ogólnie rzecz biorąc, będzie to zazwyczaj dobrze pasować w pozostałych 25%. Oczywiście przy jeszcze większej ilości zainstalowanej pamięci RAM 75% jest bezpieczniejszym wyborem. (Chciałbym, żeby ludzie z JDK wprowadzili opcję, w której można określić drabinę)
Ustawienie
MaxRAMPercentage
opcji wygląda następująco:Należy zauważyć, że te wartości procentowe są typu „podwójnego”, dlatego należy je podać kropką dziesiętną. Występuje nieco dziwny błąd, jeśli użyjesz „75” zamiast „75.0”.
źródło
Zajrzyj na stronę dokumentacji
Domyślne początkowe i maksymalne rozmiary stosu klienta JVM:
Domyślny maksymalny rozmiar sterty to połowa pamięci fizycznej do wielkości pamięci fizycznej wynoszącej 192 megabajty (MB), a poza tym jedna czwarta pamięci fizycznej do wielkości pamięci fizycznej wynoszącej 1 gigabajt (GB) .
Domyślne początkowe i maksymalne rozmiary sterty serwera JVM:
W 32-bitowych maszynach JVM domyślny maksymalny rozmiar sterty może wynosić do 1 GB, jeśli jest 4 GB lub więcej pamięci fizycznej . W 64-bitowych maszynach JVM domyślny maksymalny rozmiar sterty może wynosić do 32 GB, jeśli jest 128 GB lub więcej pamięci fizycznej
Możesz określić początkową i maksymalną wielkość sterty, używając flag -Xms (początkowy rozmiar sterty) i -Xmx (maksymalny rozmiar sterty). Jeśli wiesz, ile sterty musi działać twoja aplikacja, możesz ustawić -Xms i -Xmx na tę samą wartość
źródło
Flaga
Xms
iXmx
są flagą wirtualnej maszyny Java (JVM):Xms
:initial and minimum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:-server
tryb: 25% wolnej pamięci fizycznej,> = 8 MB i <= 64 MB-client mode
: 25% wolnej pamięci fizycznej,> = 8 MB i <= 16 MBTypical Size
:-Xms128M
-Xms256M
-Xms512M
Function
/Effect
:Xms
pamięci wielkościXmx
:maximum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:<= R27.2
Windows
:75%
całkowitej pamięci fizycznej do1GB
Linux/Solaris
:50%
dostępnej pamięci fizycznej do1GB
>= R27.3
Windows X64
:75%
całkowitej pamięci fizycznej do2GB
Linux/Solaris X64
:50%
dostępnej pamięci fizycznej do2GB
Windows x86
:75%
całkowitej pamięci fizycznej do1GB
Linux/Solaris X86
:50%
dostępnej pamięci fizycznej do1GB
Typical Size
:-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
Function
/Effect
:Xmx
pamięci wielkościXmx
, będziejava.lang.OutOfMemoryError
OutOfMemoryError
?Xmx
wartość-Xmx4g
do-Xmx8g
Więcej szczegółów
zobacz oficjalny dokument: -X Opcje wiersza polecenia
źródło
Wiele parametrów wpływa na wielkość generacji. Poniższy diagram ilustruje różnicę między zatwierdzoną przestrzenią a przestrzenią wirtualną w stercie. Podczas inicjowania maszyny wirtualnej zarezerwowane jest całe miejsce na sterty. Rozmiar zarezerwowanego miejsca można określić za pomocą
-Xmx
opcji. Jeśli wartość-Xms
parametru jest mniejsza niż wartość-Xmx
parametru, nie cała zarezerwowana przestrzeń jest natychmiast przydzielana do maszyny wirtualnej. Na tym rysunku nieprzydzielone miejsce jest oznaczone jako „wirtualne”. Różne części sterty (generacja stała, generacja najemna i generacja młoda) mogą w razie potrzeby wzrosnąć do granicy przestrzeni wirtualnej.Domyślnie maszyna wirtualna powiększa lub zmniejsza stertę w każdej kolekcji, aby utrzymać proporcję wolnej przestrzeni dla obiektów aktywnych w każdej kolekcji w określonym zakresie. Ten zakres docelowy jest ustalany procentowo przez parametry -
XX:MinHeapFreeRatio=<minimum>
i-XX:MaxHeapFreeRatio=<maximum>
, a całkowity rozmiar jest ograniczony poniżej-Xms<min>
i powyżej przez-Xmx<max>
.Parametr Wartość domyślna
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64m
Domyślne wartości parametrów wielkości sterty w systemach 64-bitowych zostały powiększone o około 30%. Ten wzrost ma zrekompensować większy rozmiar obiektów w systemie 64-bitowym.
Przy tych parametrach, jeśli procent wolnej przestrzeni w generacji spadnie poniżej 40%, generacja zostanie rozszerzona w celu utrzymania 40% wolnej przestrzeni, aż do maksymalnego dozwolonego rozmiaru generacji. Podobnie, jeśli wolne miejsce przekroczy 70%, generacja zostanie zakontraktowana, tak że tylko 70% wolnego miejsca będzie wolne, z zastrzeżeniem minimalnej wielkości generacji.
Duże aplikacje serwerowe często doświadczają dwóch problemów z tymi ustawieniami domyślnymi. Jednym z nich jest powolne uruchamianie, ponieważ początkowa sterta jest niewielka i należy zmienić jej rozmiar w wielu dużych kolekcjach. Bardziej palącym problemem jest to, że domyślny maksymalny rozmiar sterty jest nieuzasadniony mały dla większości aplikacji serwerowych. Podstawowe zasady aplikacji serwerowych to:
Zasadniczo, zwiększaj pamięć wraz ze wzrostem liczby procesorów, ponieważ alokacja może być równoległa.
Jest pełny artykuł
źródło