HOWTO · Java
Beheben Sie den Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded
Dieses Tutorial demonstriert den Fehler java.lang.outofmemoryerror: gc-Overhead-Limit überschritten in Java.
Dieses Tutorial demonstriert den Fehler Java.lang.outofmemoryerror: GC-Overhead-Limit überschritten in Java.
der Fehler Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded
Im Gegensatz zu anderen Programmiersprachen verwendet die Java-Laufzeit einen Garbage-Collector-GC-Prozess für die Garbage-Collection. In Java löscht der Garbage Collector den Speicher für sie, wenn ein bestimmter Teil des Speichers nicht verwendet wird.
Der Fehler Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded tritt auf, wenn unser Code oder unsere Anwendung den gesamten Speicher erschöpft hat und GC den Speicher nicht mehr bereinigen kann.
Der Fehler Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded signalisiert, dass die JVM zu lange gebraucht hat, um die Garbage Collection durchzuführen. JVM gibt diesen Fehler aus, wenn die Garbage-Collection 98 % der Zeit in Anspruch nimmt und nur die anderen 2 % des Heaps wiederhergestellt werden können.
Hier ist ein Beispiel, das denselben Fehler auslöst:
package delftstack;
import java.util.*;
public class Example {
public static void main(String args[]) throws Exception {
Map DemoMap = System.getProperties();
Random DemoRandom = new Random();
while (true) {
DemoMap.put(DemoRandom.nextInt(), "value");
}
}
}
Der obige Code fügt den Zufallswert kontinuierlich in die Karte ein, bis die Garbage Collection 98 % erreicht, und löst den Fehler Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded aus. Der Heap-Speicher wird in den Karten verwendet.
Siehe Ausgabe:
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
Selbst wenn wir diesen Code mit einem parallelen Garbage Collector ausführen, wird immer noch derselbe Fehler ausgegeben. Siehe das Beispiel über CMD:
java -Xmx100m -XX:+UseParallelGC Example.java
Es wird immer noch der gleiche Fehler ausgegeben. Siehe Ausgabe:
C:\Users\Sheeraz>java -Xmx100m -XX:+UseParallelGC Example1.java
Note: Example1.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1047)
at java.base/java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006)
at java.base/java.util.Properties.put(Properties.java:1301)
at delftstack.Example.main(Example1.java:9)
Beheben Sie den Fehler Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded
Die Lösung für diesen Fehler besteht darin, Speicherlecks zu verhindern. Stellen Sie sicher, dass die folgenden Punkte befolgt werden, damit Sie Speicherlecks verhindern können:
- Identifizieren Sie die Stellen, an denen die Speicherzuweisung für den Heap erfolgt.
- Es ist die beste Vorgehensweise, das Erstellen einer großen Menge von schwach referenzierten oder temporären Objekten zu vermeiden, da sie meistens der Grund für Speicherverluste sind.
- Identifizieren Sie das Objekt, das einen großen Platz auf dem Haufen einnimmt.