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.