Was bedeutet java.lang.OutOfMemoryError: GC overhead limit exceeded

OutOfMemoryError-Fehlermeldungen wie “Java heap space” und “PermGen space” sind den meisten Java-Programmierern ein Begriff. Auch im Operating sind diese beiden Meldungen häufig bekannt. Die Meldung “GC overhead limit exceeded” sieht man hingegen seltener und ist deswegen nicht immer ein Begriff.

Wird zu viel CPU Zeit für die Garbage Collection aufgewendet und es steht hierdurch zu wenig CPU Zeit für die Ausführung des eigentlichen Prozesses zu Verfügung, so tritt dieser Fehler auf. In der Default Einstellung der Oracle JVM bedeutet dies, dass 98% der CPU Zeit für die Garbage Collection aufgewendet wird, hierbei aber weniger als 2% des Heap Speichers freigeräumt werden konnte.
Die Prüfung soll verhindern, dass Anwendungen an diesem Limit nur noch extrem träge reagieren. Diese kann im Extremfall dazu führen, dass auch ein Abbrechen durch den Anwender kaum möglich ist.

Mittels der Option -XX:-UseGCOverheadLimit kann diese Prüfung auch abgeschaltet werden.

Wann tritt dieser Fehler auf? In der Praxis kann es unter anderem auch zu diesem Fehler kommen, wenn sehr viele Objekte in kurzer Zeit erzeugt werden und hierdurch die Garbage Collection unverhältnismäßig viel Zeit in Anspruch nimmt.

Der folgende Code zeigt ein Beispiel:

public class GCOverheadLimit {
    private static final long objectCount=1000000;

    public static void main(String[] args) throws Exception {
        HashMap myMap = new HashMap();
        for (int i=0; i<objectCount; i++) {
            myMap.put(i, String.valueOf(i));
        }       
    }
}
Short URL for this post: http://wp.me/p4nxik-2e2
This entry was posted in Java Basics, Java Runtimes - VM, Appserver & Cloud and tagged , , , . Bookmark the permalink.

Leave a Reply