Pre haldu objektov sa nepodarilo rezervovať dostatok miesta

1. Prehľad

V tomto výučbe sa dozvieme príčinu "Nemôžem rezervovať dostatok miesta pre haldu objektov" chyba, zatiaľ čo prechádzate niektorými možnými scenármi.

2. Príznaky

„Nemôžem rezervovať dostatok miesta pre haldu objektov“ je konkrétna chyba JVM, ktorá sa vyvolá, keď Proces Java nemôže vytvoriť súborvirtuálny počítač z dôvodu obmedzenia pamäte, ktoré sa vyskytujú v bežiacom systéme:

java -Xms4G -Xmx4G -jar HelloWorld.jar Počas inicializácie VM sa vyskytla chyba. Nie je možné rezervovať dostatok miesta pre haldu objektov Chyba: Nebolo možné vytvoriť virtuálny počítač Java. Chyba: Vyskytla sa závažná výnimka. Program sa ukončí.

Spravidla existujú dva možné scenáre, keď narazíme na chybu.

Po prvé, keď obedujeme s procesom Java maximálny parameter limitu veľkosti haldy (-Xmx) a hodnota jeviac, ako môže mať tento proces v operačnom systéme.

Limit veľkosti haldy sa líši v závislosti od niekoľkých obmedzení:

  • hardvérová architektúra (32/64 bit)
  • Bitová verzia JVM (32/64 bitová)
  • operačný systém, ktorý používame

Po druhé, keď proces Java nie je schopný rezervovať zadané množstvo pamäte kvôli iným aplikáciám, ktoré bežia na rovnakom systéme a spotrebúvajú pamäť.

3. Veľkosť haldy

Java halda priestor je oblasť alokácie pamäte pre runtime program Java spravovaný samotným JVM. Predvolene, alokačný fond je obmedzený na počiatočnú a maximálnu veľkosť. Ak sa chcete dozvedieť viac informácií o halde v prostredí Java, pozrite si tento článok tu.

Pozrime sa, aká je maximálna veľkosť haldy v rôznych prostrediach a ako môžeme nastaviť limity.

3.1. Maximálna veľkosť haldy

Maximálny teoretický limit haldy pre 32-bitový a 64-bitový JVM je možné ľahko zistiť podľa dostupného pamäťového priestoru, 2 ^ 32 (4 GB) pre 32-bitový JVM a 2 ^ 64 (16 Exabajtov) pre 64- bit JVM.

V praxi môže byť limit z dôvodu rôznych obmedzení oveľa nižší a líši sa podľa operačného systému. Napríklad, v 32-bitových systémoch Windows je maximálny rozsah veľkosti haldy medzi 1,4 GB až 1,6 GB. Naproti tomu v 32-bitových systémoch Linux sa maximálna veľkosť haldy môže natiahnuť až na 3 GB.

Pre tento dôvod, ak aplikácia vyžaduje veľkú hromadu, mali by sme použiť 64-bitový JVM. Avšak s veľkou hromadou bude mať zberač odpadu viac práce, takže je dôležité nájsť dobrú rovnováhu medzi veľkosťou haldy a výkonom.

3.2. Ako ovládať limity veľkosti haldy?

Máme dve možnosti, ako riadiť limity veľkosti haldy JVM.

Najskôr pomocou Javy parametre príkazového riadku pri každej inicializácii JVM:

-Xms Nastavuje počiatočnú veľkosť haldy Java. Táto hodnota musí byť násobkom 1024 a viac ako 1 MB. -Xmx Nastavuje maximálnu veľkosť haldy Java. Táto hodnota musí byť násobkom 1024 a viac ako 2 MB. -Xmn Nastaví počiatočnú a maximálnu veľkosť (v bajtoch) haldy pre mladú generáciu.

K hodnote veľkosti môžeme pridať písmeno k alebo K, m alebo M a g alebo G na označenie kilobajtov, megabajtov a gigabajtov. Ak nie je zadané žiadne písmeno, použije sa predvolená jednotka (bajt).

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

Po druhé, pomocou premennej prostredia JAVA_OPTS globálne nakonfigurovať vyššie uvedené parametre príkazového riadku Java. Z tohto dôvodu bude každá inicializácia JVM v systéme automaticky používať konfigurácie nastavené v premennej prostredia.

JAVA_OPTS = "- Xms256m - Xmx512m"

Ďalšie informácie nájdete v našom komplexnom sprievodcovi parametrami JVM.

4. Záver

V tomto tutoriáli sme diskutovali o dvoch možných scenároch, keď to JVM nedokáže vyhradiť dostatok miesta pre haldu objektov. Tiež sme sa naučili, ako riadiť limity veľkosti haldy, aby sme túto chybu zmiernili.

Ďalej sa dozviete viac o potenciálnych problémoch s pamäťou za behu a o tom, ako ich identifikovať.


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