Kon niet genoeg ruimte reserveren voor objecthoop

1. Overzicht

In deze tutorial leren we de oorzaak van "Kon niet genoeg ruimte reserveren voor objectheap" fout bij het doorlopen van enkele mogelijke scenario's.

2. Symptomen

"Kon niet genoeg ruimte reserveren voor objectheap" is een specifieke JVM-fout die optreedt wanneer Java-proces kan hetvirtuele machine vanwege geheugenbeperkingen die zijn aangetroffen op het actieve systeem:

java -Xms4G -Xmx4G -jar HelloWorld.jar Fout opgetreden tijdens initialisatie van VM Kon niet genoeg ruimte reserveren voor objectheap Fout: Kan de Java Virtual Machine niet maken. Fout: er is een fatale uitzondering opgetreden. Programma zal stoppen.

Over het algemeen zijn er twee mogelijke scenario's wanneer we de fout tegenkomen.

Ten eerste, als we lunchen met een Java-proces parameter maximale limiet voor heapgrootte (-Xmx) en de waarde ismeer dan wat het proces kan hebben op het besturingssysteem.

De limiet van de heapgrootte varieert op basis van verschillende beperkingen:

  • hardware-architectuur (32/64 bit)
  • JVM bit-versie (32/64 bit)
  • het besturingssysteem dat we gebruiken

Ten tweede, wanneer het Java-proces kan de opgegeven hoeveelheid geheugen niet reserveren vanwege andere applicaties die op hetzelfde systeem draaien en geheugen verbruiken.

3. Hoopgrootte

Java heapruimte is de geheugenallocatie voor het runtime Java-programma, beheerd door de JVM zelf. Standaard, de toewijzingspool is beperkt tot de initiële en maximale grootte. Lees dit artikel hier voor meer informatie over Heap Space in Java.

Laten we eens kijken wat de maximale heapgrootte is in verschillende omgevingen en hoe we de limieten kunnen instellen.

3.1. Max. Heapgrootte

De maximale theoretische heap-limiet voor de 32-bits en 64-bits JVM is eenvoudig te bepalen door te kijken naar de beschikbare geheugenruimte, 2 ^ 32 (4 GB) voor 32-bits JVM en 2 ^ 64 (16 exabytes) voor 64- beetje JVM.

In de praktijk kan de limiet vanwege verschillende beperkingen veel lager zijn en variëren afhankelijk van het besturingssysteem. Bijvoorbeeld, op 32-bits Windows-systemen ligt het maximale bereik van de heap-grootte tussen 1,4 GB en 1,6 GB. Daarentegen kan op 32-bits Linux-systemen de maximale heapgrootte oplopen tot 3 GB.

Om deze reden, als de applicatie een grote heap vereist, moeten we de 64-bit JVM gebruiken. Bij een grote hoop heeft de garbage collector echter meer werk te doen, dus het is belangrijk om een ​​goede balans te vinden tussen de grootte van de hoop en de prestaties.

3.2. Hoe de limieten van de heapgrootte te bepalen?

We hebben twee opties om de limieten voor de heapgrootte van een JVM te bepalen.

Ten eerste door Java te gebruiken opdrachtregelparameters bij elke JVM-initialisatie:

-Xms Stelt de initiële Java-heapgrootte in. Deze waarde moet een veelvoud zijn van 1024 en groter dan 1 MB. -Xmx Stelt de maximale Java-heapgrootte in. Deze waarde moet een veelvoud zijn van 1024 en groter dan 2 MB. -Xmn Stelt de initiële en maximale grootte (in bytes) van de heap in voor de jonge generatie.

Voor de maatwaarde kunnen we een brief bijvoegen k of K, m of M. en g of G om respectievelijk kilobytes, megabytes en gigabytes aan te geven. Als er geen letter is opgegeven, wordt de standaardeenheid (byte) gebruikt.

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

Ten tweede door omgevingsvariabele te gebruiken JAVA_OPTS om bovenstaande Java-opdrachtregelparameters globaal te configureren. Daarom gebruikt elke JVM-initialisatie op het systeem automatisch de configuraties die zijn ingesteld in de omgevingsvariabele.

JAVA_OPTS = "- Xms256m -Xmx512m"

Raadpleeg onze uitgebreide JVM-parametergids voor meer informatie.

4. Conclusie

In deze tutorial hebben we twee mogelijke scenario's besproken wanneer JVM dat niet kan reserveer voldoende ruimte voor de objecthoop. We hebben ook geleerd hoe u de limieten voor de heapgrootte kunt beheren om deze fout te verminderen.

Lees vervolgens meer over mogelijke geheugenproblemen tijdens runtime en hoe u deze kunt identificeren.


$config[zx-auto] not found$config[zx-overlay] not found