Ne mogu rezervirati dovoljno prostora za hrpu objekata

1. Pregled

U ovom uputstvu saznat ćemo uzrok "Ne mogu rezervirati dovoljno prostora za hrpu objekata" pogreške, dok prolazi kroz neke moguće scenarije.

2. Simptomi

"Ne mogu rezervirati dovoljno prostora za hrpu objekata" specifična je JVM pogreška koja se pojavljuje kada Java proces ne može stvoritivirtualni stroj zbog ograničenja memorije koja se susreću na pokrenutom sustavu:

java -Xms4G -Xmx4G -jar HelloWorld.jar Došlo je do pogreške tijekom inicijalizacije VM-a. Nije bilo moguće rezervirati dovoljno prostora za hrpu objekata. Greška: Nije moguće stvoriti Java virtualni stroj. Pogreška: Dogodila se kobna iznimka. Program će izaći.

Općenito postoje dva moguća scenarija kada naiđemo na pogrešku.

Prvo, kad ručamo Java proces s parametar ograničenja maksimalne veličine hrpe (-Xmx) i vrijednost jeviše od onoga što proces može imati na operacijskom sustavu.

Ograničenje veličine hrpe varira ovisno o nekoliko ograničenja:

  • hardverska arhitektura (32/64 bit)
  • JVM bitna verzija (32/64 bit)
  • operativni sustav koji koristimo

Drugo, kada Java proces nije u mogućnosti rezervirati navedenu količinu memorije zbog drugih aplikacija koje rade na istom sustavu i troše memoriju.

3. Veličina hrpe

Java hrpa prostora je spremište za dodjelu memorije za runtime Java program kojim upravlja sam JVM. Prema zadanim postavkama, bazen raspodjele ograničen je na početnu i maksimalnu veličinu. Da biste saznali više o Prostoru hrpe na Javi, pogledajte ovaj članak ovdje.

Pogledajmo koja je maksimalna veličina hrpe u različitim okruženjima i kako možemo postaviti ograničenja.

3.1. Maksimalna veličina hrpe

Maksimalno teoretsko ograničenje hrpe za 32-bitni i 64-bitni JVM lako je odrediti gledanjem dostupnog prostora memorije, 2 ^ 32 (4 GB) za 32-bitni JVM i 2 ^ 64 (16 egzabajta) za 64- bit JVM.

U praksi, zbog različitih ograničenja, ograničenje može biti puno niže i varira s obzirom na operativni sustav. Na primjer, na 32-bitnim sustavima Windows maksimalni raspon veličine hrpe je između 1,4 GB i 1,6 GB. Suprotno tome, na 32-bitnim Linux sustavima, maksimalna veličina hrpe može se protezati do 3 GB.

Zbog ovog razloga, ako aplikacija zahtijeva veliku hrpu, trebali bismo koristiti 64-bitni JVM. Međutim, s velikom hrpom sakupljač smeća imat će više posla, pa je važno pronaći dobru ravnotežu između veličine gomile i performansi.

3.2. Kako kontrolirati ograničenja veličine hrpe?

Imamo dvije mogućnosti za kontrolu ograničenja veličine hrpe JVM-a.

Prvo, korištenjem Jave parametri naredbenog retka pri svakoj inicijalizaciji JVM-a:

-Xms Postavlja početnu veličinu Java gomile. Ova vrijednost mora biti višekratnik 1024 i veća od 1 MB. -Xmx Postavlja maksimalnu veličinu Java gomile. Ova vrijednost mora biti višekratnik 1024 i veća od 2 MB. -Xmn Postavlja početnu i maksimalnu veličinu (u bajtovima) hrpe za mladu generaciju.

Za vrijednost veličine možemo dodati slovo k ili K, m ili M i g ili G za označavanje kilobajta, megabajta i gigabajta. Ako nije navedeno slovo, koristi se zadana jedinica (bajt).

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

Drugo, korištenjem varijable okoline JAVA_OPTS za globalno konfiguriranje parametara Java naredbenog retka. Zbog toga će svaka inicijalizacija JVM-a u sustavu automatski koristiti konfiguracije postavljene u varijabli okruženja.

JAVA_OPTS = "- Xms256m -Xmx512m"

Za više informacija pogledajte naš opsežni vodič za JVM parametre.

4. Zaključak

U ovom smo tutorijalu razgovarali o dva moguća scenarija kada JVM to ne može rezervirajte dovoljno prostora za hrpu predmeta. Također smo naučili kako kontrolirati ograničenja veličine hrpe kako bismo ublažili ovu pogrešku.

Zatim saznajte više o potencijalnim problemima s memorijom tijekom izvođenja i kako ih prepoznati.