OutOfMemoryError: A GC általános korlátja túllépve

1. Áttekintés

Egyszerűen fogalmazva: a JVM gondoskodik a memória felszabadításáról, amikor az objektumokat már nem használják; ezt a folyamatot Garbage Collection (GC) néven hívják.

A A GC felső határa túllépve a hiba a családból származik java.lang.OutOfMemoryError és jelzi az erőforrás (memória) kimerülését.

Ebben a rövid cikkben megnézzük, mi okozza a problémát java.lang.OutOfMemoryError: A GC felső korlátja túllépve hiba és hogyan lehet megoldani.

2. A GC overhead limit túllépte a hibát

OutOfMemoryError alosztálya java.lang.VirtualMachineError; dobja a JVM, amikor az erőforrások felhasználásával kapcsolatos problémával találkozik. Pontosabban, a hiba akkor fordul elő, amikor a JVM túl sok időt töltött a Szemétgyűjtés végrehajtásával és csak nagyon kevés kupacterületet tudott visszaszerezni.

A Java dokumentumok szerint alapértelmezés szerint a JVM úgy van konfigurálva, hogy dobja ezt a hibát, ha a Java folyamat ideje több mint 98% -át GC-vel tölti, és amikor az egyes futtatások során a kupacnak csak kevesebb mint 2% -át állítják helyre. Más szavakkal, ez azt jelenti, hogy alkalmazásunk szinte az összes rendelkezésre álló memóriát kimerítette, és a Garbage Collector túl sok időt töltött annak megtisztításával, és ismételten kudarcot vallott.

Ebben a helyzetben a felhasználók az alkalmazás rendkívül lassúságát tapasztalják. Bizonyos műveletek, amelyek általában ezredmásodpercekben fejeződnek be, több időt igényelnek. Ez azért van, mert a CPU teljes kapacitását használja a Szemétgyűjtéshez, és ezért más feladatokat nem tud végrehajtani.

3. Hiba a műveletben

Nézzünk meg egy darab kódot, ami dob java.lang.OutOfMemoryError: A GC felső korlátja túllépve.

Ezt például úgy érhetjük el, hogy kulcs-érték párokat adunk egy meg nem szedett ciklusba:

public class OutOfMemoryGCLimitExceed {public static void addRandomDataToMap () {Map dataMap = new HashMap (); Véletlenszerű r = új Véletlenszerű (); while (true) {dataMap.put (r.nextInt (), String.valueOf (r.nextInt ())); }}}

Ha ezt a módszert meghívja, akkor a JVM argumentumokkal -Xmx100m -XX: + UseParallelGC (A Java halom méretét 100 MB-ra állítottuk, a GC algoritmus pedig ParallelGC), a java.lang.OutOfMemoryError: A GC felső korlátja túllépve hiba. A különböző szemétgyűjtő algoritmusok jobb megértése érdekében ellenőrizhetjük az Oracle Java szemétgyűjtés alapjai oktatóanyagát.

Kapunk egy java.lang.OutOfMemoryError: A GC felső korlátja túllépve nagyon gyorsan a következő parancs futtatásával a projekt gyökérzetéből:

mvn exec: exec

Azt is meg kell jegyezni, hogy bizonyos helyzetekben halomterű hibával találkozhatunk, mielőtt találkoznánk a A GC felső határa túllépve hiba.

4. A GC overhead limit túllépett hiba megoldása

Az ideális megoldás az alkalmazás alapproblémájának megkeresése a memóriaszivárgások kódjának megvizsgálásával.

A következő kérdésekkel kell foglalkozni:

  • Melyek azok az objektumok az alkalmazásban, amelyek a halom nagy részét foglalják el?
  • A forráskód mely részeiben vannak lefoglalva ezek az objektumok?

Használhatunk olyan automatizált grafikus eszközöket is, mint például a JConsole, amely segít a teljesítményproblémák felderítésében a kódban, beleértve java.lang.OutOfMemoryErrors.

Utolsó megoldásként növelni lehetne a kupac méretét a JVM indítási konfigurációjának megváltoztatásával. Például ez 1 GB halom helyet biztosít a Java alkalmazás számára:

java -Xmx1024m com.xyz.TheClassName

Ez azonban nem oldja meg a problémát, ha a tényleges alkalmazáskódban memóriaszivárgások vannak. Ehelyett csak elhalasztjuk a hibát. Ezért ajánlatos alaposabban felmérni az alkalmazás memóriahasználatát.

5. Következtetés

Ebben az oktatóanyagban megvizsgáltuk a java.lang.OutOfMemoryError: A GC felső korlátja túllépve és a mögöttes okok.

Mint mindig, a cikkhez kapcsolódó forráskód megtalálható a GitHubon.