Nie udało się zarezerwować wystarczającej ilości miejsca na stertę obiektów

1. Przegląd

W tym samouczku poznamy przyczynę błędu „Nie można zarezerwować wystarczającej ilości miejsca na stertę obiektów” , przechodząc przez kilka możliwych scenariuszy.

2. Objawy

„Nie można zarezerwować wystarczającej ilości miejsca na stertę obiektów” to specyficzny błąd maszyny JVM, który jest zgłaszany, gdy proces Java nie może utworzyć maszyny wirtualnej z powodu ograniczeń pamięci napotkanych w działającym systemie:

java -Xms4G -Xmx4G -jar HelloWorld.jar Error occurred during initialization of VM Could not reserve enough space for object heap Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.

Ogólnie rzecz biorąc, istnieją dwa możliwe scenariusze napotkania błędu.

Po pierwsze, kiedy uruchamiamy proces Java z parametrem maksymalnego rozmiaru sterty ( -Xmx ), a wartość jest większa niż to, co proces może mieć w systemie operacyjnym .

Limit rozmiaru sterty zależy od kilku ograniczeń:

  • architektura sprzętowa (32/64 bit)
  • Wersja bitowa JVM (32/64 bit)
  • system operacyjny, którego używamy

Po drugie, gdy proces Java nie jest w stanie zarezerwować określonej ilości pamięci z powodu innych aplikacji, które działają w tym samym systemie i zajmują pamięć.

3. Rozmiar sterty

Przestrzeń sterty Java to pula alokacji pamięci dla programu Java środowiska wykonawczego, zarządzana przez samą maszynę JVM. Domyślnie pula alokacji jest ograniczona do rozmiaru początkowego i maksymalnego. Aby dowiedzieć się więcej o Heap Space w Javie, zajrzyj do tego artykułu tutaj.

Zobaczmy, jaki jest maksymalny rozmiar sterty w różnych środowiskach i jak możemy ustawić limity.

3.1. Maksymalny rozmiar sterty

Maksymalny teoretyczny limit sterty dla 32-bitowej i 64-bitowej maszyny JVM można łatwo określić, patrząc na dostępne miejsce w pamięci, 2 ^ 32 (4 GB) dla 32-bitowej maszyny JVM i 2 ^ 64 (16 eksabajtów) dla 64- bit JVM.

W praktyce, ze względu na różne ograniczenia, limit ten może być znacznie niższy i różni się w zależności od systemu operacyjnego. Na przykład w 32-bitowych systemach Windows maksymalny zakres rozmiaru sterty wynosi od 1,4 GB do 1,6 GB . Z kolei w 32-bitowych systemach Linux maksymalny rozmiar sterty może rozciągać się do 3 GB.

Z tego powodu, jeśli aplikacja wymaga dużej sterty, powinniśmy użyć 64-bitowej maszyny JVM . Jednak w przypadku dużej sterty moduł odśmiecania pamięci będzie miał więcej do wykonania, dlatego ważne jest, aby znaleźć odpowiednią równowagę między rozmiarem sterty a wydajnością.

3.2. Jak kontrolować limity rozmiaru sterty?

Mamy dwie opcje kontrolowania limitów wielkości sterty maszyny JVM.

Po pierwsze, używając parametrów wiersza poleceń języka Java przy każdej inicjalizacji maszyny JVM:

-Xms Sets initial Java heap size. This value must be a multiple of 1024 and greater than 1 MB. -Xmx Sets maximum Java heap size. This value must be a multiple of 1024 and greater than 2 MB. -Xmn Sets the initial and maximum size (in bytes) of the heap for the young generation.

Jako wartość rozmiaru możemy dołączyć literę k lub K , m lub M i g lub G, aby wskazać odpowiednio kilobajty, megabajty i gigabajty. Jeśli nie określono żadnej litery, używana jest jednostka domyślna (bajt).

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

Po drugie, używając zmiennej środowiskowej JAVA_OPTS do globalnej konfiguracji powyższych parametrów wiersza poleceń Java. W związku z tym każda inicjalizacja maszyny JVM w systemie będzie automatycznie używać konfiguracji ustawionych w zmiennej środowiskowej.

JAVA_OPTS="-Xms256m -Xmx512m"

Aby uzyskać więcej informacji, zapoznaj się z naszym obszernym przewodnikiem po parametrach maszyny JVM.

4. Wniosek

W tym samouczku omówiliśmy dwa możliwe scenariusze, w których JVM nie jest w stanie zarezerwować wystarczającej ilości miejsca na stertę obiektów . Dowiedzieliśmy się również, jak kontrolować limity rozmiaru sterty, aby złagodzić ten błąd.

Następnie dowiedz się więcej o potencjalnych problemach z pamięcią w czasie wykonywania i jak je zidentyfikować.