Nem lehet elegendő helyet lefoglalni az objektumkupac számára

1. Áttekintés

Ebben az oktatóanyagban megtudhatjuk az okát „Nem lehet elegendő helyet lefoglalni az objektumkupac számára” hiba, miközben átmegy néhány lehetséges forgatókönyvön.

2. Tünetek

A „Nem lehet elegendő helyet lefoglalni az objektumhalom számára” egy speciális JVM-hiba, amely akkor merül fel A Java folyamat nem tudja létrehozni avirtuális gép a futó rendszeren előforduló memória-korlátok miatt:

java -Xms4G -Xmx4G -jar HelloWorld.jar Hiba történt a virtuális gép inicializálása során. Nem sikerült elegendő helyet lefoglalni az objektumkupacnak Hiba: Nem sikerült létrehozni a Java virtuális gépet. Hiba: Végzetes kivétel történt. A program kilép.

Általában két lehetséges forgatókönyv van, amikor a hibával találkozunk.

Először is, amikor ebédelünk egy Java-eljárással max halom méretkorlát paraméter (-Xmx) és az érték vantöbbet, mint amit a folyamat az operációs rendszeren érhet el.

A kupac méretkorlátja számos korlátozás alapján változik:

  • hardver architektúra (32/64 bit)
  • JVM bites verzió (32/64 bites)
  • az általunk használt operációs rendszer

Másodszor, amikor a Java folyamat nem képes lefoglalni a megadott memóriamennyiséget más, ugyanazon a rendszeren futó és memóriát fogyasztó alkalmazások miatt.

3. Halomméret

Jáva a halomterület a memóriafoglalási készlet a futásidejű Java program számára, amelyet maga a JVM kezel. Alapértelmezés szerint, az allokációs készlet a kezdeti és a maximális méretre korlátozódik. Ha többet szeretne megtudni a Java halomteréről, tekintse meg ezt a cikket itt.

Lássuk, mi a maximális kupacméret a különböző környezetekben, és hogyan állíthatjuk be a határokat.

3.1. Halom maximális mérete

A 32 és 64 bites JVM maximális elméleti halomkorlátját könnyű meghatározni, ha megnézzük a rendelkezésre álló memóriaterületet: 2 ^ 32 (4 GB) a 32 bites JVM-hez és 2 ^ 64 (16 Exabyte) 64 bit JVM.

A gyakorlatban a különféle megszorítások miatt a határ sokkal alacsonyabb lehet, és az operációs rendszertől függően változik. Például, 32 bites Windows rendszereken a halom maximális mérettartománya 1,4 és 1,6 GB között van. Ezzel szemben a 32 bites Linux rendszereken a maximális kupacméret akár 3 GB is lehet.

Emiatt, ha az alkalmazás nagy halmot igényel, akkor a 64 bites JVM-et kell használnunk. Nagy kupac esetén azonban a szemétszedőnek több feladata lesz, ezért fontos, hogy megfelelő egyensúlyt találjon a kupac mérete és teljesítménye között.

3.2. Hogyan lehet ellenőrizni a halom méretkorlátjait?

Két lehetőségünk van a JVM kupacméretének korlátozására.

Először a Java használatával parancssori paraméterek minden JVM inicializáláskor:

-Xms Beállítja a kezdeti Java halom méretét. Ennek az értéknek 1024-szeresének és 1 MB-nál nagyobbnak kell lennie. -Xmx Megadja a Java halom maximális méretét. Ennek az értéknek 1024-szeresének és 2 MB-nál nagyobbnak kell lennie. -Xmn Beállítja a halom kezdeti és maximális méretét (bájtokban) a fiatal generáció számára.

A méret értékéhez fűzhetünk levelet k vagy K, m vagy M és g vagy G hogy kilobájt, megabájt és gigabájt legyen. Ha nincs megadva betű, akkor az alapértelmezett egységet (bájt) kell használni.

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

Másodszor, a környezeti változó használatával JAVA_OPTS a Java parancssori paraméterek felett globálisan konfigurálni. Emiatt a rendszer minden egyes JVM inicializálása automatikusan felhasználja a környezeti változóban beállított konfigurációkat.

JAVA_OPTS = "- Xms256m -Xmx512m"

További információért olvassa el átfogó JVM paraméterek útmutatónkat.

4. Következtetés

Ebben az oktatóanyagban két lehetséges forgatókönyvet vitattunk meg, amikor a JVM nem képes elegendő helyet foglaljon el a tárgyhalm számára. Megtanultuk azt is, hogyan lehet szabályozni a halom méretkorlátjait e hiba enyhítése érdekében.

Ezután tudjon meg többet a futás közbeni memóriaproblémákról és azok azonosításáról.