2 Stimmen

Java: Ist der 'tenured' Speicher dasselbe wie permgen?

Ich versuche, Informationen zu einem gelegentlichen Problem zu sammeln, das wir haben, bei dem die App nach ein paar Wochen Betrieb langsamer wird, gut funktioniert, langsamer wird, gut funktioniert, wobei die Intervalle zwischen langsam und gut funktionierend immer kürzer werden. Meine Theorie ist, dass wir im Laufe der Zeit häufiger Speicher bereinigen. Eine weitere wichtige Information ist, dass wir gelegentlich OOM PermGen-Probleme hatten.

Ich habe verbose:gc aktiviert und sehe jetzt GC-Ausgaben in catalina.out. Ich denke, ich muss das PrintGCDetails-Flag hinzufügen, basierend auf den Informationen hier:

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

Das Aktivieren des letzten Flags gibt Informationen zum Sammeln von "Tenured" -Speicher aus. Die Frage ist, ob das der Speicher ist, der PermGen-Fehler verursacht, oder ob es etwas anderes ist. Und wenn es etwas anderes ist, wie kann ich Informationen protokollieren, die den PermGen-Speicher zeigen werden?

EDIT - Ich kann leider keine der JVM-Überwachungstools in dieser Umgebung verwenden.

EDIT - Ich habe die genannten Konfigurationsoptionen hinzugefügt, sowie eine für die Anzeige der Tenuring-Verteilung, ich bekomme Dinge wie

27.701: [GC 27.701: [ParNew
Desired survivor size 2162688 bytes, new threshold 4 (max 4)
- age   1:    1906560 bytes,    1906560 total
- age   2:       2064 bytes,    1908624 total
- age   3:       5064 bytes,    1913688 total
- age   4:     650368 bytes,    2564056 total
: 35684K->2678K(38336K), 0.0068580 secs] 224179K->191173K(1065664K), 0.0069700 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

Ist die ParNew-Generation der PermGen-Speicher?

und

 (concurrent mode failure): 25387K->31940K(1027328K), 0.2983200 secs] 50714K->31940K(1065664K), [CMS Perm : 35273K->35139K(35392K)], 0.2985210 secs] [Times: user=0.30 sys=0.00, real=0.30 secs] 
 (concurrent mode failure): 25356K->31941K(1027328K), 0.3032690 secs] 50861K->31941K(1065664K), [CMS Perm : 35264K->35129K(35392K)], 0.3034800 secs] [Times: user=0.30 sys=0.00, real=0.31 secs]

die Fehler machen mir Sorgen.

Vielen Dank im Voraus

4voto

Charlie Collins Punkte 8676

Tenured und PermGen sind nicht dasselbe. Sie sind verwandt, aber nicht dasselbe. Die genauen Details hängen von der Implementierung in der JVM ab, die Sie verwenden, aber aus dem von Ihnen verlinkten Dokument:

"Eine dritte Generation, die eng mit der Tenured-Generation verbunden ist, ist die Permanent-Generation. Die Permanent-Generation ist besonders, weil sie Daten enthält, die von der virtuellen Maschine benötigt werden, um Objekte zu beschreiben, die auf der Java-Sprachebene keine Entsprechung haben. Zum Beispiel werden Objekte, die Klassen und Methoden beschreiben, in der Permanent-Generation gespeichert."

Interned Strings und Klassendetails und ähnliches werden typischerweise in PERM gespeichert, während lang lebende Java-Objekte in TENURED gespeichert sind.

Hier ist ein guter Artikel, der PermGen erklärt (und wie man es anpassen kann): http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

1voto

MBCook Punkte 14110

Internieren Sie irgendwelche Strings oder laden Sie irgendwelche Klassen?

Die beiden Dinge, die meinen Permgen-Speicher aufbrauchen, sind, wenn Sie Strings internieren, die es nicht sollten (was dazu führt, dass alle möglichen nicht sammelbaren Strings herumhängen) und alte Klassendefinitionen, die durch das Laden neuer Klassen verursacht werden (normalerweise durch das erneute Bereitstellen von Tomcat, nach etwa einem Dutzend kann das bei uns passieren).

Irgendwie erinnere ich mich daran, dass Tomcat 6 besser mit dem erneuten Bereitstellungsproblem umgeht, und 7 sollte es beheben, aber das ist spontan.

Verwenden Sie externe Bibliotheken oder native Code-Bibliotheken? Es würde mich nicht überraschen, wenn die von ihnen freigesetzten Ressourcen gegen den Permgen zählen (nur eine Vermutung).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X