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?
Antwort
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,
Ich suche gezielt, welche Objekte in der permanenten Generation sind. Diese Tools werden diese Frage nicht beantworten. – Tom
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
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
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. –
meinen Blogpost über thr permsize of Eclipse
Kurz In dem Memory Analyzer doit kann, aber Sie müssen die SAP JVM.
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 ...
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.
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.
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.
Eine Technik, die mir geholfen hat, war die Verwendung der -verbose:class
command-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.
- 1. JQuery Wie finde ich heraus, was der Ajax-Fehler ist?
- 2. Wie finde ich heraus, was svchost macht?
- 3. Wie finde ich heraus, was dieser Charakter ist?
- 4. Wie finde ich heraus, was an einem Ort ist?
- 5. Wie finde ich heraus, was ich wissen muss?
- 6. Wie finde ich heraus, was Eclipse im Hintergrund macht?
- 7. Wie finde ich heraus, was meinen SQL Server hämmert?
- 8. Wie finde ich heraus, was UITextField eine UIKeyboardWillShowNotification verursacht hat?
- 9. Wie finde ich heraus, wo NUnit hängt?
- 10. Wie finde ich heraus, was die Empfehlungsurl war?
- 11. Wie finde ich heraus, worauf mach_msg_trap wartet?
- 12. Wie finde ich heraus, ob DStream leer ist?
- 13. Wie finde ich heraus, ob das Blatt leer ist?
- 14. Wie finde ich den aktuellen Überlaufprüfkontext heraus?
- 15. Wie finde ich heraus, ob ein Termin privat ist
- 16. ActiveDirectory: Wie finde ich heraus, ob eine Domain verfügbar ist?
- 17. Wie finde ich meinen ISP heraus?
- 18. Wie finde ich heraus, ob Element von jQuery umschlossen ist?
- 19. Wie finde ich heraus, ob die Zeit vergangen ist? Swift
- 20. Wie finde ich heraus, wo eine Python-Warnung ist von
- 21. Wie finde ich heraus, wo eine Python-Warnung ist von
- 22. Wie finde ich heraus, wer mit ActionCable verbunden ist?
- 23. Wie finde ich heraus, dass die ReadFile-Funktion abgelaufen ist?
- 24. Wie finde ich heraus, warum renameTo() fehlgeschlagen ist?
- 25. Wie finde ich heraus, wo das Python-Include-Verzeichnis ist?
- 26. Wie finde ich heraus, wo eine Funktion definiert ist?
- 27. Wie finde ich heraus, ob ein Steuerelement gerade ungültig ist?
- 28. Wie finde ich heraus, ob ein Objekt gesperrt ist? C#
- 29. Wie finde ich heraus, wo eine Android-App gespeichert ist?
- 30. Was ist der Algorithmus hinter Minesweeper Generation
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
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
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