Tomcat java.lang.OutOfMemoryError: GC overhead limit exceeded
Versuchen wir migrieren unsere Anwendung auf dem Tomcat-7.0 von OC4J. Die Anwendung funktioniert gut mit OC4J aber in tomcat die Leistung wird beeinträchtigt, wenn mit Belastung-Test mit 10 Benutzern. Wir bekommen diese Fehler und die Anwendung nicht mehr reagieren.
---java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "ajp-bio-8009-exec-231" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "ajp-bio-8009-exec-236" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "ajp-bio-8009-exec-208" java.lang.OutOfMemoryError: GC overhead limit exceeded
java.lang.OutOfMemoryError: GC overhead limit exceeded
java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "Thread-33" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "ajp-bio-8009-exec-258" java.lang.OutOfMemoryError: GC overhead limit exceeded
java.lang.OutOfMemoryError: GC overhead limit exceeded
Wir haben versucht JAVA_OPTS="-Xms4096m -Xmx8192m
. Sieht aus wie wir immer noch den Fehler. Schlagen Sie bitte die möglichen Optionen, die wir ausprobieren könnten..
Garbage collection Protokolle
GC Anrufungen=593 (full 539):
PSYoungGen insgesamt 701120K, verwendet 374720K [0x00000007aaab0000, 0x00000007eaf60000, 0x0000000800000000)
eden Raum 374720K, 100% verwendet [0x00000007aaab0000,0x00000007c18a0000,0x00000007c18a0000)
aus dem Weltraum 326400K, 0% verwendet [0x00000007d70a0000,0x00000007d70a0000,0x00000007eaf60000)
auf Platz 339328K, 0% verwendet [0x00000007c18a0000,0x00000007c18a0000,0x00000007d6400000)
ParOldGen insgesamt 2796224K, verwendet 2796223K [0x0000000700000000, 0x00000007aaab0000, 0x00000007aaab0000)
Objekt Raum 2796224K, 99% verwendet [0x0000000700000000,0x00000007aaaaffe8,0x00000007aaab0000)
PSPermGen insgesamt 50688K, verwendet 50628K [0x00000006fae00000, 0x00000006fdf80000, 0x0000000700000000)
Objekt Raum 50688K, 99% verwendet [0x00000006fae00000,0x00000006fdf713a8,0x00000006fdf80000)
4482.450: [Full GC [PSYoungGen: 374720K->339611K(701120K)] [ParOldGen: 2796223K->2796222K(2796224K)] 3170943K->3135834K(3497344K) [PSPermGen: 50628K->50628K(50688K)], 1.4852620 Sekunden]
InformationsquelleAutor Uppi | 2015-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
GC Overrhead Limit exceeded
in der Regel impliziert die Anwendung ist "undicht" - Speicher, wo einige. Ihre heap ist hoch in den Speicher zu verwenden, wie 98/99% und eine full-GC abrufen, vielleicht ein Prozent oder zwei. Was zu tun ist, verbringt es die meiste Zeit GCing. Die JVM überprüft, um zu sehen, wie oft es ausgegeben hat GCing und bei überschreiten von Grenzwert dieses Fehlers ist, was geworfen wird.Um es zu beheben, müssen Sie prüfen wo das Leck Auftritt. Tun Sie dies, indem Sie ein heap-dump. Sie können jmap. Sobald Sie es erhalten, sollten Sie die % der heap wird wahrscheinlich gehören meist zu einer Menge von Objekten
Das ist eine Menge und nur verzögert das unvermeidliche.
Bearbeiten Sie die update -
Als ich erwartet Ihre OldGen Raum ist zu 99% mit wenig zurückgefordert werden. OldGen Raum ist, wo alle lange gelebt Objekt platziert wird. Da Sie nicht zurückfordern von Speicher alle diese Objekte werden schließlich in OldGen und Sie läuft out of memory.
Was ist lesenswert sind die beiden Zeilen hier:
Wie ich bereits erwähnt habe, OldGen ist bei 99% und eine Volle GC nur reaktiviert 1KB YounGen und 35KB OldGen. Es wird auf GC fast sofort wieder. Es sollte GCing GBs an dieser Stelle.
So
Erhalten einen heap dump und finden Sie heraus, was die größten Täter hier ist. Untersuchen Sie, wo diese Objekte erstellt werden und warum Sie nicht immer unerreichbar.
Wenn Sie andere Fragen haben über, wie/wo oder warum lassen Sie mich wissen, aber es gibt nichts, was ich Ihnen sagen kann, an dieser Stelle.
Hi Johannes...ich habe die javaheap dump....und ich sehe oben und ich sehe die top-Verbraucher----- org.apache.catalina.loader.StandardClassLoader @ 0x782b5f140 722 35,128 23,037,032 59.15% org.apache.catalina.loader.WebappClassLoader @ 0x78274a710 259 4,384 11,372,480 29.20% <system-class-loader
Dies ist, während es übermäßig hinterher hinken?
Nein...wenn es normal ist. Ich hatte den dump laufen auf meinem Rechner und ich bekam diese Ergebnisse. Wollen Sie mich laufen heapdump, wenn es hinterher??
Toll zu hören! Diese Art des debugging ist eine andere und unterhaltsame Teil der Programmierung, herzlichen Glückwunsch!
InformationsquelleAutor John Vint
Detail-Nachricht "GC overhead limit exceeded" bedeutet, dass der garbage collector läuft die ganze Zeit und Java-Programm macht sehr langsame Fortschritte.
Behoben werden kann 2 Möglichkeiten
1) Durch die Unterdrückung von GC Overhead limit Warnung in JVM-parameter
Ex- -Xms1024M -Xmx2048M -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit
-UseGCOverheadLimit - Parameter wird verwendet, um zu unterdrücken GCOverHead.
2) Durch die Identifizierung der Speicherverlust
InformationsquelleAutor Harsh Maheswari
Was ist Ihre permsize ? Können Sie erhöhen, es zu sagen, 512m
GC Overhead limit ist nicht der perm generation läuft aus.
John. Ich lief der Spur, und das sehe ich für die garbage collection-Heap vor . Modifizierte ich die Frage jetzt
Werfen Sie einen Blick auf das edit auf meine Antwort.
Es gibt keine permanente Generierung in Java 8. Alle seine meta-Raum in eden generation.
InformationsquelleAutor souser