Kunne ikke reservere nok plads til objektbunke

1. Oversigt

I denne vejledning lærer vi årsagen til “Kunne ikke reservere nok plads til objektbunke” fejl, mens du gennemgår nogle mulige scenarier.

2. Symptomer

"Kunne ikke reservere nok plads til objektbunke" er en specifik JVM-fejl, der hæves når Java-processen kan ikke oprettevirtuel maskine på grund af hukommelsesbegrænsninger på det kørende system:

java -Xms4G -Xmx4G -jar HelloWorld.jar Der opstod en fejl under initialisering af VM Kunne ikke reservere nok plads til objektbunke Fejl: Kunne ikke oprette Java Virtual Machine. Fejl: Der er sket en dødelig undtagelse. Programmet afslutter.

Generelt er der to mulige scenarier, når vi støder på fejlen.

For det første, når vi frokost en Java-proces med parameter for maks. bunke størrelse (-Xmx) og værdien ermere end hvad processen kan have på operativsystemet.

Grænsen for bunkestørrelse varierer afhængigt af flere begrænsninger:

  • hardwarearkitektur (32/64 bit)
  • JVM bitversion (32/64 bit)
  • det operativsystem, vi bruger

For det andet, når Java-processen er ikke i stand til at reservere den specificerede mængde hukommelse på grund af andre applikationer, der kører på det samme system og bruger hukommelse.

3. Bunke størrelse

Java heap space er hukommelsesallokeringspuljen til runtime Java-programmet, der administreres af selve JVM. Som standard, tildelingspuljen er begrænset til den oprindelige og maksimale størrelse. For at lære mere om Heap Space i Java, se denne artikel her.

Lad os se, hvad den maksimale bunke størrelse er i forskellige miljøer, og hvordan vi kan sætte grænserne.

3.1. Maks bunke størrelse

Den maksimale teoretiske heap-grænse for 32-bit og 64-bit JVM er let at bestemme ved at se på den tilgængelige hukommelsesplads, 2 ^ 32 (4 GB) til 32-bit JVM og 2 ^ 64 (16 Exabyte) til 64- bit JVM.

I praksis på grund af forskellige begrænsninger kan grænsen være meget lavere og varierer i betragtning af operativsystemet. For eksempel, på 32-bit Windows-systemer er det maksimale rækkevidde af bunke mellem 1,4 GB og 1,6 GB. I modsætning hertil kan den maksimale bunke størrelse på 32-bit Linux-systemer strække sig op til 3 GB.

Af denne grund, hvis applikationen kræver en stor bunke, skal vi bruge 64-bit JVM. Men med en stor bunke vil skraldopsamleren have mere arbejde at gøre, så det er vigtigt at finde en god balance mellem bunke størrelse og ydeevne.

3.2. Sådan styres grænser for bunkestørrelse?

Vi har to muligheder for at kontrollere bunkestørrelsesgrænserne for en JVM.

Først ved hjælp af Java kommandolinjeparametre ved hver JVM-initialisering:

-Xms Indstiller den oprindelige Java bunke størrelse. Denne værdi skal være et multiplum på 1024 og større end 1 MB. -Xmx Indstiller maksimal Java bunke størrelse. Denne værdi skal være et multiplum på 1024 og større end 2 MB. -Xmn Indstiller den indledende og maksimale størrelse (i byte) af bunken til den unge generation.

For størrelsesværdien tilføjer vi muligvis brev k eller K, m eller M og g eller G for at angive henholdsvis kilobyte, megabyte og gigabyte. Hvis der ikke er angivet et bogstav, bruges standardenheden (byte).

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

For det andet ved at bruge miljøvariabler JAVA_OPTS for at konfigurere over Java-kommandolinjeparametre globalt. På grund af dette bruger hver JVM-initialisering på systemet automatisk de konfigurationer, der er indstillet i miljøvariablen.

JAVA_OPTS = "- Xms256m -Xmx512m"

For mere information, se vores omfattende JVM Parameter guide.

4. Konklusion

I denne vejledning diskuterede vi to mulige scenarier, når JVM ikke er i stand til det reserver plads nok til objektbunke. Vi lærte også, hvordan man styrer grænserne for dyngestørrelse for at afbøde denne fejl.

Lær derefter mere om potentielle hukommelsesproblemer under kørsel, og hvordan du identificerer dem.