Zwiększ rozmiar sterty w Javie


276

Pracuję na serwerze z systemem Windows 2003 (64-bitowym) z 8 GB pamięci RAM. Jak mogę zwiększyć maksimum pamięci sterty? Używam -Xmx1500mflagi, aby zwiększyć rozmiar sterty do 1500 Mb. Czy mogę zwiększyć pamięć sterty do 75% pamięci fizycznej (sterty 6 GB)?


2
Próbowałeś -Xmx6g? Czy to nie zadziałało? Co zaobserwowałeś
oxbow_lakes

2
Zakładam, że próbowałeś zwiększyć stos, ale się nie udało? Czy używasz 64-bitowej maszyny JVM?
Bart Kiers

Dzięki za komentarz, ale to nie działa
Sunil

Cóż - skąd wiesz, że to nie działa? Czy JVM nie uruchamia się?
oxbow_lakes

Odpowiedzi:


327

Możesz zwiększyć do 4 GB w systemie 32-bitowym. Jeśli masz system 64-bitowy, możesz przejść wyżej. Nie musisz się martwić, jeśli wybierzesz niepoprawnie, jeśli poprosisz o 5g w 32-bitowym systemie Java, narzeka na niepoprawną wartość i kończy pracę.

Jak napisali inni, używaj flag cmd-line - np

java -Xmx6g myprogram

Możesz uzyskać pełną listę (lub prawie pełną listę, i tak), wpisując java -X.


16
Z mojego doświadczenia wynika, że ​​rzeczywisty rozmiar sterty Java zaakceptuje przy użyciu maszyny wirtualnej 32b (w systemie 32b lub 64b - maszyna wirtualna jest tutaj ważną częścią), wynosi około 2G. Zaskoczony pytający nie szukał najpierw i nie znalazł: stackoverflow.com/questions/1596009/... i: stackoverflow.com/questions/37335/...
wsorenson

2
Ach, masz rację, oczywiście - w systemie 32-bitowym możesz adresować tylko 2 Gb pamięci.
Steve B.

Czy konieczne jest, aby maksymalny stos i minimalny rozmiar stosu były takie same?
user1747935

1
Nie. Ale ludzie często to robią, ponieważ JVM nigdy nie może tracić czasu na zmianę rozmiaru. Wątpię, czy to ma duże znaczenie, TBH.
Steve B.

1
@ PhilipRego ustawiasz to, co chcesz, do granic, które może rozwiązać JVM. -Xmx2G ustawia twoją pamięć na 2G (spójrz także na -Xms). To wcale nie mówi nic o tym, ile pamięci będziesz potrzebować.
Steve B.

155

Możliwe jest zwiększenie wielkości sterty przydzielonej przez JVM za pomocą opcji wiersza poleceń. Mamy tutaj 3 opcje

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

java -Xms16m -Xmx64m ClassName

W powyższym wierszu możemy ustawić minimalną stertę na 16 MB, a maksymalną stertę na 64 MB


28

W 32-bitowej maszynie JVM największy rozmiar sterty, jaki można teoretycznie ustawić, to 4 GB. Aby użyć większego rozmiaru sterty, musisz użyć 64-bitowej maszyny JVM. Spróbuj wykonać następujące czynności:

java -Xmx6144M -d64

Flaga -d64 jest ważna, ponieważ informuje maszynę JVM, aby działała w trybie 64-bitowym.


Dziękuję szefie, ale to nie działa w moim systemie, brakuje mi jeszcze czegoś innego
Sunil

4
Zdefiniuj „nie działa”. Czy to się nie uruchamia i wyświetla błąd? Zaczyna się, ale używa innego rozmiaru sterty?
Kevin

11

Możliwe jest zwiększenie wielkości sterty przydzielonej przez JVM w eclipse bezpośrednio w eclipse Goto IDE

Uruchom ----> Uruchom konfiguracje ----> Argumenty

Wpisz -Xmx1g (służy do ustawienia maksymalnego rozmiaru, takiego jak Xmx256m lub Xmx1g ...... m -> mb g ---> gb)


3
Wystarczy dodać, że powinien to być argument maszyny wirtualnej (eclipse daje dwie opcje).
Matt Boyle,

11

java -d64 -Xms512m -Xmx4g HelloWorld

gdzie -d64: Włącza 64-bitową maszynę JVM -Xms512m: Ustawi początkową wielkość sterty jako 512 MB -Xmx4g: Ustawi maksymalną wielkość sterty jako 4 GB (tutaj nazwa pliku Java to: HelloWorld.java)


9

Możesz zwiększyć rozmiar sterty, przekazując parametry JVM -Xms i -Xmx, jak poniżej:

W przypadku plików jar:

java -jar -Xms4096M -Xmx6144M jarFilePath.jar

W przypadku plików Java:

 java -Xms4096M -Xmx6144M ClassName

Powyższe parametry zwiększają wielkość InitialHeapSize (-Xms) do 4 GB (4096 MB), a MaxHeapSize (-Xmx) do 6 GB (6144 MB).

Ale rozmiar sterty młodej generacji pozostanie taki sam, a dodatkowy rozmiar sterty zostanie dodany do wielkości sterty starej generacji . Aby wyrównać wielkość sterty młodej generacji i sterty starej generacji , użyj parametrów -XX: NewRatio = 1 -XX: -UseAdaptiveSizePolicy .

java -jar -Xms4096M -Xmx6144M -XX:NewRatio=1 -XX:-UseAdaptiveSizePolicy pathToJarFile.jar

-XX: NewRatio = Heap Old Gen Rozmiar: Young Gen HeapSize (Możesz grać z tym współczynnikiem, aby uzyskać pożądany współczynnik).


7

Czy mogę zwiększyć pamięć sterty do 75% pamięci fizycznej (sterty 6 GB)?

Tak, możesz. W rzeczywistości możesz zwiększyć ilość pamięci fizycznej więcej niż chcesz.

To, czy warto to zrobić, zależy od tego, ile jeszcze działa w twoim systemie. W szczególności, jeśli „działający zestaw” aplikacji i usług, które są obecnie uruchomione, znacznie przekracza dostępną pamięć fizyczną, twój system może „przeładować”, spędzając dużo czasu na przenoszeniu stron pamięci wirtualnej na dysk iz dysku. Efektem netto jest to, że system staje się strasznie wolny.


Dzięki za komentarz Ale jak mogę zwiększyć. Plz możesz wydać polecenie.
Sunil

Spróbuj -Xmx6000m. Powinien działać, jeśli używasz 64-bitowej wersji Java.
Stephen C

3
Czy na pewno używasz 64-bitowej wersji Java? W 64-bitowym systemie operacyjnym?
Stephen C

4

Użyj poniższej komendy, aby zmienić rozmiar sterty na 6 GB

export JAVA_OPTS="-Xms6144m -Xmx6144m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m"

Jeśli mam pamięć 8G w swoim systemie i od menedżera zadań widzę, że zawsze używana jest 70% tej pamięci; czy można przydzielić pamięć 6G wielkości sterty Java?
Reihan_amn

1
@Reihan_amn Tak i nie, jeśli przekroczysz pamięć, przejdzie do stronicowania, które znajduje się na dysku i jest bardzo wolne. Jeśli przekroczysz pliki stronicowania, czeka Cię zły czas.
CodeMonkey,

2

Kilka osób wskazało konkretne odpowiedzi dotyczące wielkości sterty z opcjami jvm -Xmsi -Xms. Chcę podkreślić, że nie jest to jedyny typ opcji pamięci dla JVM. W szczególności, jeśli dostajesz stos ponad przepływy, będziesz chciał zwiększyć rozmiar stosu, dodając dodatkową opcję, np -Xss8m.

W przypadku tego problemu -Xms2g -Xmx6g -Xss8mrozwiązaniem byłyby opcje jvm czegoś podobnego .

Udostępniam te informacje, ponieważ moje wyszukiwania w Google dotyczące sposobu zwiększenia pamięci jvm zaprowadziły mnie do tego rozwiązania, a rozwiązania nie działały przy dużej ilości alokacji pamięci. Gdy dowiedziałem się, do czego służą określone ustawienia, mogłem google, jak zwiększyć rozmiar stosu i znalazłem brakujący parametr. :) Mam nadzieję, że zaoszczędzi to innym czas, ponieważ zaoszczędziłoby mi to mnóstwo czasu. :)


2

Działa to tylko z 64-bitową wersją Java. Przejdź do Panelu sterowania i kliknij ikonę Java. W małym oknie Panelu sterowania Java kliknij pasek menu Java, a następnie kliknij viewprzycisk.

Jeśli masz dwie platformy Java, wyłącz poprzednią wersję Java, a następnie kliknij pole tekstowe Parametry wykonawcze i napisz -Xmx1024mmniej niż rozmiar pamięci RAM. Nie zwiększaj wielkości sterty równej pamięci RAM, w przeciwnym razie nastąpi awaria systemu.


Jeśli rozmiar stosu będzie równy pamięci RAM, system nie ulegnie awarii. Zamiast tego system zacznie stronicować i będzie ładny i wolny.
DaveTheMinion,

0

Tak. Możesz.

Możesz zwiększyć pamięć sterty do 75% pamięci fizycznej (sterty 6 GB) lub więcej.

Ponieważ korzystasz z wersji 64-bitowej, możesz zwiększyć rozmiar stosu do żądanej kwoty. W przypadku korzystania z wersji 32-bitowej jest ona ograniczona do 4 GB.

$ java -Xms512m -Xmx6144m JavaApplication

Ustawia początkową wielkość sterty na 512 MB i maksymalny rozmiar stosu na 6 GB.

Mam nadzieję, że to pomoże.. :)


Wydaje się to bardzo podobne do dwóch najczęściej głosowanych odpowiedzi opublikowanych kilka lat wcześniej.
Bernhard Barker,

0

Mam problem z uruchomieniem plików py w moim kodzie Java przy użyciu środowiska eclipse / STS, otrzymuję PyException z powodu niewystarczającej pamięci sterty jvm. Dokonałem zmian wymienionych poniżej i jestem w stanie rozwiązać ten problem. Poniżej znajduje się moja konfiguracja systemu.

wprowadź opis zdjęcia tutaj

I to są zmiany, które wprowadziłem w moim obszarze roboczym i voila działa teraz idealnie.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

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.