2008-10-11 10 views
11

Wie kann ich herausfinden, was der Inhalt der permanenten Generation ist, wenn ich einen Heapdump oder eine laufende VM verwende? Ich kenne 'jmap -permstat', aber das ist nicht unter Windows verfügbar.Wie finde ich heraus, was in der permanenten Generation ist?

+0

Antwort auf Ihre Frage, aber vielleicht geben Sie eine Antwort auf Ihr Problem - Sun JVM hat eine Permgen, aber es gibt andere JVMs, die nicht darunter leiden. – Tnilsson

+3

Das Problem hier ist, dass das Permgen (oder das Äquivalent in anderen JVMs) nicht von der JVMTI-Schnittstelle offengelegt wird, und so haben Tools keine Mittel, es zu untersuchen. Es ist ein großes Problem mit Tool-Anbietern. – skaffman

+1

Bitte geben Sie die Java-Version an. In früheren Sonnenstunden war GC sehr versessen darauf, Klassen zu sammeln. Wenn Sie einen Heapdump erhalten, können Sie auch erraten, ob interne Strings Ihr Problem sind. – Ron

Antwort

-1

Sie können JConsole oder jvisualvm.exe (mit jdk 1.6 7) verwenden, um zu finden, wo ist. Wenn Sie wissen möchten, wie alle Ihre Objekte miteinander und mit dem Baum der Objekte zusammenhängen, sollten Sie Eclipse Memory Analyzer ausprobieren - http://www.eclipse.org/mat/.

Zusammenfassend erhalten Sie wollen Sie wollen von "http://www.eclipse.org/mat/".

Viel Glück,

+0

Ich suche gezielt, welche Objekte in der permanenten Generation sind. Diese Tools werden diese Frage nicht beantworten. – Tom

+0

Hallo Tom, MAT kann Ihre Frage beantworten, aber Sie müssten die SAP JVM verwenden, die im Moment leider ein wenig schwierig zu bekommen ist. Sie müssten NW CE von https://www.sdn.sap.com/irj/sdn/nw-ce erhalten – kohlerm

1

Die permanente Generation enthält das Klassenobjekt. Sie sollten also den Heap-Dump oder eine andere Form der Objektliste für Klassen überprüfen. Wenn Sie Problem mit der Größe der permanenten Generation haben in der Regel durch zwei Grund verursacht:

  • Ihr Programm oder eine Bibliothek, die Sie erstellt dynamisch Klassen verwenden, und die Standardgröße der permanenten Generation ist zu klein - einfach increate der Größe mit -XX: MaxPermSize = 256m
  • Ihr Programm oder eine Bibliothek, die Sie verwenden, erstellt dynamisch neue Klassen jedes Mal, wenn es aufgerufen wird, so dass die Größe der permanenten Generation nonstop erhöht - das ist ein Programmierfehler, den Sie beheben sollten (oder suchen ein Update/einen Fehlerbericht erstellen)

Um zu sehen, was ist Ihr cas Überprüfen Sie die Größe der permanenten Generation über einen längeren Zeitraum.

Und eine gute Übersicht über permanente Generation:

http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

+0

Diese Antwort ist unvollständig: Wir haben derzeit eine App, die Permgen Speicher und die Anzahl der geladenen Klassen verliert ist absolut konstant. Beide Fakten können mit JConsole angezeigt werden. Wir leiden unter dem gleichen Problem wie das Original-Poster, da wir keine Möglichkeit haben, die Permgen im Detail zu analysieren. –

0

Haben Sie ein bestimmtes Problem zu lösen? Die Verwendung von String.intern() ist eine der typischen Ursachen für Permgen-Probleme. Zusätzlich haben Projekte mit vielen Klassen auch Probleme.

Ich weiß nicht, wie in den Permgen zu bekommen und sehen, was es dort ...

0

Permanent Generation enthält nur zwei Arten von Dingen wirklich ist: Klassendefinitionen und internierten Strings. Letzteres gibt Ihnen sehr selten Probleme, aber es wird oft für Probleme verantwortlich gemacht. Häufiger ist der eine, der aufgrund von Codegenerierung und partiellem Warmladen Probleme verursacht (dangling references).

Anders als der Name vermuten lässt, wird Permgen auch GC'ed, nur nicht Teil des regulären GC-Zyklus. Daher werden nicht referenzierte internierte Strings und nicht verwendete Klassen aufgeräumt. Aber Permgen wächst auch nicht dynamisch, was bedeutet, dass es manchmal notwendig ist, seine Einstellungen für JVM-Start manuell zu ändern.

0

Ich bin in der gleichen Sache, aber aufgrund von Speicher Einschränkungen einer eingebetteten Plattform.

Sehen Sie sich den Code für jmap an, das permstat-Tool ist nur verfügbar, wenn die Klasse sun.jvm.hotspot.tools.HeapSummary verfügbar ist. Diese Klasse ist Teil des Serviceability-Agenten. Laut OpenJDK-Dokumentation (http://openjdk.java.net/groups/serviceability/svcjdk.html # bsa):

Servicefähigkeit Agentenkomponenten werden als Teil des Standard-Builds des HotSpot-Repository erstellt. Diese Komponenten sind:

-libsaproc.so: Dies ist die systemeigene Code-Komponente von SA.

-sa-jdi.jar: Dies ist die Java-Klassen von SA enthält. Es enthält eine Implementierung von JDI, die es JDI-Clients ermöglicht, schreibgeschütztes Debugging für Kerndateien und blockierte Prozesse durchzuführen.

SA wird durch jinfo verwendet, jmap, jstack

Hinweis: Um die Intaktstelle und die Technologien, die es verwenden, werden derzeit nicht in JDK enthalten veröffentlicht auf den Windows-Plattformen.

Das scheint auch für Oracle JDK der Fall zu sein. Ich möchte das Jmap-Tool ändern, um mehr Informationen zu erhalten.

1

Dieser Artikel beschreibt, wie programmgesteuert Informationen zu Heap-Auslastung, Speicherpools (einschließlich Permgen-Speicherplatz) usw. erkannt werden. Es ist sehr einfach:

MemoryUsage usage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage(); 
    long nonHeapFree = usage.getMax() - usage.getUsed(); 
    long nonHeapTotal = usage.getMax(); 

In meinen Tests auf OSX (Sun VM) „nicht Heap Speichernutzung“ passt die Werte für den Permgen Pool zurückgegeben eng und vermutlich wird etwas Nützliches auf VMs tun, die PermGen nicht haben.

0

Eine Technik, die mir geholfen hat, war die Verwendung der -verbose:classcommand-line option to java, und Sie erhalten eine Protokollausgabe, die Ihnen sagt, wie Klassen geladen/entladen werden. Da Klassen in den Permgen geladen werden, kann dies unter bestimmten Umständen helfen.

Verwandte Themen