Det gick inte att reservera tillräckligt med utrymme för objekthög

1. Översikt

I den här självstudien lär vi oss orsaken till felet ”Det gick inte att reservera tillräckligt med utrymme för objekthög” medan vi går igenom några möjliga scenarier.

2. Symtom

”Det gick inte att reservera tillräckligt med utrymme för objekthögen” är ett specifikt JVM-fel som tas upp när Java-processen inte kan skapa den virtuella maskinen på grund av minnesbegränsningar i det löpande systemet:

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.

Generellt finns det två möjliga scenarier när vi stöter på felet.

För det första, när vi lunchar en Java-process med max heap size limit parameter ( -Xmx ) och värdet är mer än vad processen kan ha på operativsystemet .

Högstorleksgränsen varierar beroende på flera begränsningar:

  • hårdvaruarkitektur (32/64 bit)
  • JVM-bitversion (32/64 bit)
  • operativsystemet som vi använder

För det andra, när Java-processen inte kan reservera den angivna mängden minne på grund av andra program som körs på samma system och förbrukar minne.

3. Högstorlek

Java- heap space är minnesallokeringspoolen för Java-programmet runtime, som hanteras av JVM själv. Som standard är allokeringspoolen begränsad till den initiala och maximala storleken. För att lära dig mer om Heap Space i Java, ta en titt på den här artikeln här.

Låt oss se vad den maximala högstorleken är i olika miljöer och hur vi kan ställa in gränserna.

3.1. Max höjdstorlek

Den maximala teoretiska höggränsen för 32-bitars och 64-bitars JVM är lätt att bestämma genom att titta på tillgängligt minnesutrymme, 2 ^ 32 (4 GB) för 32-bitars JVM och 2 ^ 64 (16 Exabyte) för 64- lite JVM.

I praktiken, på grund av olika begränsningar, kan gränsen vara mycket lägre och varierar med tanke på operativsystemet. Till exempel, på 32-bitars Windows-system är det högsta storleksintervallet mellan 1,4 GB och 1,6 GB . Däremot kan den maximala högstorleken sträcka sig upp till 3 GB på 32-bitars Linux-system.

Av den anledningen, om applikationen kräver en stor hög bör vi använda 64-bitars JVM . Men med en stor hög kommer sopuppsamlaren att ha mer arbete att göra, så det är viktigt att hitta en bra balans mellan högstorlek och prestanda.

3.2. Hur man kontrollerar högstorleksgränser?

Vi har två alternativ för att kontrollera högstorleksgränserna för en JVM.

Först genom att använda Java- kommandoradsparametrar vid varje JVM-initialisering:

-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.

För storleksvärdet kan vi lägga till bokstaven k eller K , m eller M och g eller G för att ange kilobyte, megabyte respektive gigabyte. Om ingen bokstav anges, används standardenheten (byte).

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

För det andra, genom att använda miljövariabel JAVA_OPTS för att konfigurera över Java-kommandoradsparametrar globalt. På grund av detta kommer varje JVM-initialisering i systemet automatiskt att använda de konfigurationer som ställts in i miljövariabeln.

JAVA_OPTS="-Xms256m -Xmx512m"

För mer information, kolla in vår omfattande JVM-parameterguide.

4. Slutsats

I den här handledningen diskuterade vi två möjliga scenarier när JVM inte kan reservera tillräckligt med utrymme för objekthög . Vi lärde oss också hur man kontrollerar högstorleksgränserna för att mildra detta fel.

Lär dig mer om potentiella minnesproblem vid körning och hur du identifierar dem.