OutOfMemoryError: GC Overhead Limit overschreden

1. Overzicht

Simpel gezegd, de JVM zorgt ervoor dat er geheugen wordt vrijgemaakt wanneer objecten niet langer worden gebruikt; dit proces wordt Garbage Collection (GC) genoemd.

De GC Overhead-limiet overschreden fout is er een uit de familie van java.lang.OutOfMemoryError en is een indicatie van een uitputting van middelen (geheugen).

In dit korte artikel zullen we bekijken wat de oorzaak is van de java.lang.OutOfMemoryError: GC Overhead Limit overschreden fout en hoe deze kan worden opgelost.

2. Fout GC-overheadlimiet overschreden

Onvoldoende geheugen fout is een subklasse van java.lang.VirtualMachineError; het wordt door de JVM gegenereerd wanneer het een probleem tegenkomt dat verband houdt met het gebruik van bronnen. Specifieker, de fout treedt op wanneer de JVM te veel tijd heeft besteed aan het uitvoeren van Garbage Collection en kon slechts heel weinig hoopruimte terugwinnen.

Volgens Java-documenten is de JVM standaard geconfigureerd om deze fout te genereren als het Java-proces meer dan 98% van de tijd besteedt aan GC en wanneer slechts minder dan 2% van de heap in elke run wordt hersteld. Met andere woorden, dit betekent dat onze applicatie bijna al het beschikbare geheugen heeft uitgeput en dat de Garbage Collector te veel tijd heeft besteed aan het opschonen en herhaaldelijk is mislukt.

In deze situatie ervaren gebruikers extreme traagheid van de applicatie. Bepaalde bewerkingen, die meestal in milliseconden worden voltooid, hebben meer tijd nodig om te voltooien. Dit komt doordat de CPU zijn volledige capaciteit voor Garbage Collection gebruikt en daarom geen andere taken kan uitvoeren.

3. Fout in actie

Laten we eens kijken naar een stukje code dat gooit java.lang.OutOfMemoryError: GC Overhead Limit overschreden.

We kunnen dat bijvoorbeeld bereiken door sleutel-waardeparen toe te voegen in een niet-afgesloten lus:

openbare klasse OutOfMemoryGCLimitExceed {openbare statische leegte addRandomDataToMap () {Map dataMap = nieuwe HashMap (); Random r = new Random (); while (true) {dataMap.put (r.nextInt (), String.valueOf (r.nextInt ())); }}}

Wanneer deze methode wordt aangeroepen, met de JVM-argumenten als -Xmx100m -XX: + UseParallelGC (Java-heapgrootte is ingesteld op 100 MB en het GC-algoritme is ParallelGC), we krijgen een java.lang.OutOfMemoryError: GC Overhead Limit overschreden fout. Om een ​​beter begrip te krijgen van de verschillende Garbage Collection-algoritmen, kunnen we de Oracle Java Garbage Collection Basics-zelfstudie bekijken.

We krijgen een java.lang.OutOfMemoryError: GC Overhead Limit overschreden fout zeer snel door de volgende opdracht uit te voeren vanuit de root van het project:

mvn exec: exec

Er moet ook worden opgemerkt dat we in sommige situaties een heapruimtefout kunnen tegenkomen voordat we de GC Overhead-limiet overschreden fout.

4. Fout GC Overhead Limit Exceeded oplossen

De ideale oplossing is om het onderliggende probleem met de applicatie te vinden door de code te onderzoeken op geheugenlekken.

Volgende vragen moeten worden beantwoord:

  • Wat zijn de objecten in de applicatie die grote delen van de hoop beslaan?
  • In welke delen van de broncode worden deze objecten toegewezen?

We kunnen ook geautomatiseerde grafische tools gebruiken zoals JConsole die helpt om prestatieproblemen in de code op te sporen, inclusief java.lang.OutOfMemoryErrors.

Het laatste redmiddel zou zijn om de heap-grootte te vergroten door de JVM-startconfiguratie te wijzigen. Dit geeft bijvoorbeeld 1GB heapruimte voor de Java-applicatie:

java -Xmx1024m com.xyz.TheClassName

Dit lost het probleem echter niet op als er geheugenlekken zijn in de eigenlijke applicatiecode. In plaats daarvan stellen we de fout gewoon uit. Daarom is het raadzaam om het geheugengebruik van de applicatie grondig opnieuw te beoordelen.

5. Conclusie

In deze tutorial hebben we de java.lang.OutOfMemoryError: GC Overhead Limit overschreden en de redenen erachter.

Zoals altijd is de broncode met betrekking tot dit artikel te vinden op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found