Nu s-a putut rezerva suficient spațiu pentru grămada de obiecte

1. Prezentare generală

În acest tutorial, vom afla cauza erorii „Nu s-a putut rezerva suficient spațiu pentru grămada de obiecte” , în timp ce parcurgem câteva scenarii posibile.

2. Simptome

„Nu s-a putut rezerva suficient spațiu pentru heap-ul obiectului” este o eroare specifică JVM care apare atunci când procesul Java nu poate crea mașina virtuală din cauza constrângerilor de memorie întâlnite pe sistemul în execuție:

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.

În general, există două scenarii posibile atunci când întâlnim eroarea.

În primul rând, atunci când prânzim un proces Java cu parametrul limită de dimensiune maximă a heap-ului ( -Xmx ) și valoarea este mai mare decât ceea ce poate avea procesul pe sistemul de operare .

Limita dimensiunii heap-ului variază în funcție de mai multe constrângeri:

  • arhitectură hardware (32/64 biți)
  • Versiune bit JVM (32/64 bit)
  • sistemul de operare pe care îl folosim

În al doilea rând, atunci când procesul Java nu poate rezerva cantitatea specificată de memorie din cauza altor aplicații care rulează pe același sistem și consumă memorie.

3. Dimensiunea grămezii

Spațiul heap Java este grupul de alocare a memoriei pentru programul Java runtime, administrat chiar de JVM. În mod implicit, grupul de alocare este limitat la dimensiunea inițială și maximă. Pentru a afla mai multe despre spațiul Heap din Java, aruncați o privire la acest articol aici.

Să vedem care este dimensiunea maximă a heap-ului în diferite medii și cum putem stabili limitele.

3.1. Dimensiunea maximă a grămezii

Limita teoretică maximă a heap-ului pentru JVM pe 32 de biți și pe 64 de biți este ușor de determinat privind spațiul de memorie disponibil, 2 ^ 32 (4 GB) pentru JVM pe 32 de biți și 2 ^ 64 (16 Exabytes) pentru 64- bit JVM.

În practică, datorită diferitelor constrângeri, limita poate fi mult mai mică și variază în funcție de sistemul de operare. De exemplu, pe sistemele Windows pe 32 de biți, dimensiunea maximă a heap-ului este cuprinsă între 1,4 GB și 1,6 GB . În schimb, pe sistemele Linux pe 32 de biți, dimensiunea maximă a heap-ului poate ajunge până la 3 GB.

Din acest motiv, dacă aplicația necesită o grămadă mare, ar trebui să folosim JVM pe 64 de biți . Cu toate acestea, cu o grămadă mare, colectorul de gunoi va avea mai mult de lucru, deci este important să găsiți un echilibru bun între dimensiunea grămezii și performanță.

3.2. Cum să controlați limitele dimensiunii heap-ului?

Avem două opțiuni pentru a controla limitele de dimensiune a heap-ului unei JVM.

Mai întâi, utilizând parametrii liniei de comandă Java la fiecare inițializare 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.

Pentru valoarea mărimii, putem adăuga litera k sau K , m sau M și g sau G pentru a indica kilobyți, megaocteți și, respectiv, gigaocteți. Dacă nu este specificată nicio literă, se utilizează unitatea implicită (octet).

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

În al doilea rând, utilizând variabila de mediu JAVA_OPTS pentru a configura deasupra parametrilor liniei de comandă Java la nivel global. Datorită acestui fapt, fiecare inițializare JVM pe sistem va utiliza automat configurațiile setate în variabila de mediu.

JAVA_OPTS="-Xms256m -Xmx512m"

Pentru mai multe informații, consultați ghidul nostru complet de parametri JVM.

4. Concluzie

În acest tutorial, am discutat două scenarii posibile atunci când JVM nu poate rezerva suficient spațiu pentru heap-ul obiectelor . De asemenea, am învățat cum să controlăm limitele dimensiunii heap-ului pentru a atenua această eroare.

Apoi, aflați mai multe despre potențialele probleme de memorie în timpul rulării și cum să le identificați.