2017-07-14 5 views
1

Wir verwenden JDK 8 und einige unserer Prozesse geben OOM "komprimierten Klassenraum". Wir protokollieren GC und unsere jvm-Datei statistics.log gibt derzeit die folgende Art von Protokolleinträgen an:java zum Verfolgen und Anpassen von Compression Class Space

2017-06-30 03: 57: 07,944 INFO - HEAP - [VERWENDUNG: 1678,7, FREI: 986,7, GESAMT: 2665,5 , MAX: 2665.5]; PERM - [VERWENDUNG: N/A, FREI: N/V, MAX: N/V]; KLASSEN - [Geladen: 1832624, entladen: 637, links: 1831987]; Threads - [Anzahl: 92]

Wir fragen uns, ob das Hinzufügen der Flags "-XX: + TraceClassUnloading -XX: + TraceClassLoading" würde uns wissen lassen, welchen Wert wir für den "Compressed Class Space" (-XX : KomprimierteClassSpaceSize)? Wenn ja, wie bestimmen wir die Größe aus den Ablaufverfolgungsprotokollen?

+3

Wenn Sie nicht wissen, was der beste Wert für diese Option ist, geben Sie diese Option nicht an und lassen Sie die JVM wählen. Wenn Sie der Meinung sind, dass 1832624 Klassen ziemlich groß sind, können Sie in Ihrer Anwendung nach Lecks suchen. – Holger

Antwort

2

Sie können -XX:-UseCompressedClassPointers verwenden, um den komprimierten Klassenbereich zu deaktivieren, der es der JVM ermöglichen sollte, so viele Klassen wie möglich in den Arbeitsspeicher zu laden, statt in den virtuellen Speicherbereich der komprimierten Klasse. Der Nachteil sind größere Klassenzeiger in Objektheadern.

Aber wie @Holger in den Kommentaren erwähnt, sollten Sie sicherstellen, dass Ihre Anwendung Klassen im Laufe der Zeit nicht leckt, sonst wird Speicherverbrauch weiter wachsen.

+0

Unsere Anwendung verwendet JAXB. Ich vermute, dass wir dieses Problem möglicherweise haben: https://stackoverflow.com/questions/3259291/do-i-have-a-jaxb-classloader-leak – anjanb