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.