OutOfMemoryError: GC Overhead Limit overskredet
1. Oversikt
Enkelt sagt, JVM tar seg av å frigjøre minne når objekter ikke lenger brukes; denne prosessen kalles Garbage Collection (GC).
De GC-overheadgrense overskredet feil er en fra familien til java.lang.OutOfMemoryError og er en indikasjon på en ressurs (minne) utmattelse.
I denne raske artikkelen vil vi se på hva som forårsaker java.lang.OutOfMemoryError: GC Overhead Limit Exceeded feil og hvordan det kan løses.
2. Feil for GC-overheadgrense overskredet
OutOfMemoryError er en underklasse av java.lang.VirtualMachineError; den kastes av JVM når den støter på et problem knyttet til ressursutnyttelse. Mer spesifikt, feilen oppstår når JVM brukte for mye tid på å utføre søppelinnsamling og var bare i stand til å gjenvinne veldig lite haugplass.
I følge Java-dokumenter er JVM som standard konfigurert til å kaste denne feilen hvis Java-prosessen bruker mer enn 98% av tiden sin på å gjøre GC, og når bare mindre enn 2% av dyngen blir gjenopprettet i hvert løp. Med andre ord betyr dette at søknaden vår har brukt opp nesten alt tilgjengelig minne, og søppeloppsamleren har brukt for mye tid på å prøve å rense det og mislyktes gjentatte ganger.
I denne situasjonen opplever brukerne ekstrem treghet i applikasjonen. Visse operasjoner, som vanligvis fullføres i millisekunder, tar mer tid å fullføre. Dette er fordi prosessoren bruker hele kapasiteten til søppeloppsamling og dermed ikke kan utføre andre oppgaver.
3. Feil i aksjon
La oss se på et stykke kode som kaster java.lang.OutOfMemoryError: GC Overhead Limit Exceeded.
Vi kan oppnå det, for eksempel ved å legge til nøkkelverdipar i en ubestemt løkke:
offentlig klasse OutOfMemoryGCLimitExceed {public static void addRandomDataToMap () {Map dataMap = new HashMap (); Tilfeldig r = ny Tilfeldig (); while (true) {dataMap.put (r.nextInt (), String.valueOf (r.nextInt ())); }}}
Når denne metoden påberopes, med JVM-argumentene som -Xmx100m -XX: + UseParallelGC (Java haugestørrelse er satt til 100 MB og GC-algoritmen er ParallelGC), vi får en java.lang.OutOfMemoryError: GC Overhead Limit Exceeded feil. For å få en bedre forståelse av forskjellige Garbage Collection-algoritmer, kan vi sjekke Oracle's Java Garbage Collection Basics tutorial.
Vi får en java.lang.OutOfMemoryError: GC Overhead Limit Exceeded feil veldig raskt ved å kjøre følgende kommando fra roten til prosjektet:
mvn exec: exec
Det skal også bemerkes at i noen situasjoner kan vi støte på en bunkeplassfeil før vi støter på GC-overheadgrense overskredet feil.
4. Å løse GC overheadgrense overskredet feil
Den ideelle løsningen er å finne det underliggende problemet med applikasjonen ved å undersøke koden for eventuelle minnelekkasjer.
Følgende spørsmål må tas opp:
- Hva er objektene i applikasjonen som opptar store deler av dyngen?
- I hvilke deler av kildekoden blir disse objektene tildelt?
Vi kan også bruke automatiserte grafiske verktøy som JConsole som hjelper til med å oppdage ytelsesproblemer i koden inkludert java.lang.OutOfMemoryErrors.
Den siste utveien ville være å øke haugstørrelsen ved å endre JVM-lanseringskonfigurasjonen. For eksempel gir dette 1 GB massevis plass for Java-applikasjonen:
java -Xmx1024m com.xyz.TheClassName
Dette løser imidlertid ikke problemet hvis det er minnelekkasjer i selve applikasjonskoden. I stedet vil vi bare utsette feilen. Derfor er det mer tilrådelig å vurdere minnebruk av programmet på nytt.
5. Konklusjon
I denne opplæringen undersøkte vi java.lang.OutOfMemoryError: GC Overhead Limit Exceeded og årsakene bak.
Som alltid kan kildekoden relatert til denne artikkelen finnes på GitHub.