java.lang.OutOfMemoryError: Komprimiert Klasse Platz
Sind wir running auf java-8-oracle.
Zogen wir in java8 sechs Monaten.
In den letzten Tagen haben wir immer ein OOME von Zeit zu Zeit, und wir waren nicht in der Lage, Sie zu identifizieren oder reproduzieren Sie das problem.
Wenn wir führen einen Aufruf an den server (tomcat) wir bekommen das der Fehler auf der stacktrace:
java.lang.OutOfMemoryError: Compressed class space
Neustart des Servers löst das problem. Der gleiche Aufruf auf anderen server funktioniert, und so hat ein weiterer Aufruf von einem anderen Typ auf dem gleichen server.
Wenn man auf der gc.log-sehen wir:
2015-05-27T16:05:42.991+0000: 98774.440: [Full GC (Last ditch collection) 98774.440: [CMS: 575745K->575330K(3495936K), 0.8687777 secs] 575745K->575330K(4107008K), [Metaspace: 97940K->97940K(1396736K)], 0.8696093 secs] [Times: user=0.95 sys=0.00, real=0.88 secs]
2015-05-27T16:05:55.486+0000: 98786.935: [Full GC (Metadata GC Threshold) 98786.935: [CMS: 573414K->578735K(3495936K), 0.9372859 secs] 925046K->578735K(4107008K), [Metaspace: 99428K->99428K(1396736K)], 0.9386626 secs] [Times: user=1.01 sys=0.00, real=0.94 secs]
jstat -gc
gibt:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
87296.0 87296.0 0.0 3151.4 523776.0 148284.4 3495936.0 574868.5 1395640.0 98066.3 1048576.0 11339.1 12165 636.851 223 116.957
753.808
Sehe ich keine Probleme mit dem Speicher, entweder in der jstat-Protokoll oder in der gc-log.
Versuchen zu laufen jmap -clstats
hängt:
Attaching to process ID 5110, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02
finding class loader instances ..
Nach welchen Zeitraum sehen Sie diese Ausnahme? Haben Sie versucht, die Erhöhung der CompressedClassSpace? e.g: -XX: CompressedClassSpaceSize=1g ? Wenn Sie sehen, dass das problem wieder, aber nach einer längeren Zeit, die Sie zu haben scheinen, ein Speicher-Leck von einer Art sein.
ersten mal begegnen, vor 2 Tagen in einem der server (die wir nicht bereitstellen, neue version). Server-Neustart und als es sah wieder nach 12 Stunden nur auf einem der Server. Belastung dosnt helfen, sich zu reproduzieren. Die Kompresse Größe ist bleiben fast die gleichen und es nicht näher 1G, das ist die Standardeinstellung.
Dies könnte ein JVM-Fehler. Es ist ein andauernder hotspot-gc-dev Diskussion von einem problem mit ähnlichen Symptomen. Versuchen Sie tuning der Metaspace wachsen-schrumpfen-Politik.
InformationsquelleAutor user1236097 | 2015-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standen wir vor einem ähnlichen Problem. Leider heapdumps dir nicht helfen, da der Unterricht nicht im heap, sondern im nativen Speicher. Aktivieren Sie diese in Ihrem JVM-Einstellungen zu beheben, die Klassen geladen:
-XX:+PrintGCDetails -XX:+TraceClassUnloading -XX:+TraceClassLoading
In unserem Fall das Problem war JAXBContext.newInstance nicht als singleton.
Glück,
Albert
InformationsquelleAutor Albert
Komprimierte oops und komprimiert Klasse Zeiger, die den verfügbaren Platz für die Klassen eingeschränkt ist aufgrund der notwendigen Zeiger mangeln. 1 GB in deinem Fall.
Das ist eine Menge von Klassen, so könnte dies einen darauf hinweisen, dass etwas in Ihrer Anwendung ist, erzeugen eine Menge von Klassen und nie loslassen. Anwendung neu laden vielleicht?
Wenn Sie sicher sind, dass Ihre Anwendung genau das braucht so viel Speicher für Klassen können Sie versuchen, stoßen über die Grenze
-XX:CompressedClassSpaceSize=...
oder deaktivieren komprimiert Klasse Zeiger über-XX:-UseCompressedClassPointers
.Beachten Sie, dass standardmäßig komprimierte Klasse Raum + komprimierten Haufen (+ etwas overhead) darf nicht mehr als 32GB. Obwohl, AIUI, ändern Objekte ausrichten können, stoßen diese Grenze weiter.
Sonst sollte man einen heapdump und analysieren, was hält auf die geladenen Klassen.
könnte sein, die Fragmentierung? Ich glaube nicht, dass die Klasse Raum wird verdichtet. Obwohl so ein großer Faktor ist sonderbar, sogar, wenn es die Fragmentierung. Außerdem denke ich, du bist aus durch eine Spalte, immer noch eine Diskrepanz bleibt.
Sie können laufen, um zu sehen, überprüfen, wenn ich das falsch in Spalten: echo "S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT\n 87296.0 87296.0 0.0 3151.4 523776.0 148284.4 3495936.0 574868.5 1395640.0 98066.3 1048576.0 11339.1 12165 636.851 223 116.957 753.808" | Spalte -t
Du hast Recht. Sehr seltsam. Noch, versuchen Sie die Optionen und aktivieren Sie auch die heap-dump auf OOME wie @Marged vorgeschlagen. Zumindest sollte es Hilfe weitere Diagnose.
InformationsquelleAutor the8472