Wie interpretieren Sie die Ausgabe von "jmap -permstat"?

Ich versuche die Problembehandlung bei einem permgen Leck, und wollte Fragen, ob Ihr Leute für Eure Meinungen, wie interpretieren Sie die Ausgabe von jmap -permstat.

Sagen, dass ich eine jmap -permstat Bericht, wie diese:

class_loader        classes  bytes     parent_loader       alive?  type

<bootstrap>            4791  25941568                null   live  <internal>
0x00000007203ed508        0         0  0x00000007203ed228   dead  com/example/object/SomeObjectType$FirstClassLoader@0x0000000something1
0x000000071dc17620        1      3056  0x0000000705e692a8   dead  sun/reflect/DelegatingClassLoader@0x0000000something4
0x000000071f26a898        0       100                null   dead  com/example/object/SomeClassLoader@0x0000000something3
0x0000000721c6dba0        0       100                null   dead  com/example/object/SomeClassLoader@0x0000000something3
0x000000071e36df20        0       100                null   dead  com/example/object/SomeClassLoader@0x0000000something3
0x000000072157c1b8      339   2069112  0x000000072157b8d8   dead  com/example/object/SomeObjectType$SecondClassLoader@0x0000000something2
0x00000007128b7830        1      1912  0x0000000700056db8   dead  sun/reflect/DelegatingClassLoader@0x0000000something4
0x0000000707634360        1      3088  0x0000000700056db8   dead  sun/reflect/DelegatingClassLoader@0x0000000something4

So würde ich das interpretieren der Ausgabe oben-- bitte korrigieren Sie alle Fehler, die ich gemacht habe dabei.

Die Werte in der Spalte "Typ" sind nicht eindeutig. Wir sehen einige Objekte, die drei mal angezeigt werden. Jedoch, die class_loader Wert ist eindeutig über alle drei; daher ist jede von Ihnen eine unterschiedliche Objekte, besetzen permgen space. In diesem Beispiel, jeder nimmt 100 bytes; daher 300 bytes der permgen space wird belegt durch Objekte vom Typ SomeClassLoader.

Wenn die Klassen Wert ungleich null ist, dann muss das Objekt ein class-loader von einer Art, und dieser bezieht sich auf die Anzahl der Klassen, auf den es verweist. (Hinweis: In der eigentlichen Datei, diese drei Objekte haben, die Nullen in der Spalte bytes; ich habe Hinzugefügt, die Werte für dieses Beispiel. In der Praxis, ich vermute, dass, wenn es eine 0 ist, in der Klassen-Spalte, es gibt keine Möglichkeit die bytes Wert kann alles sein, aber null.)

Wenn die alive-Wert ist "tot", das bedeutet, dass das Objekt bereit ist, die garbage Collection, aber die JVM ist nicht zu tun. Es gibt eine separate Diskussion war als auf Gründe, warum dies der Fall sein kann.

Wenn es einen Wert in der parent_loader Spalte, dann ist dies ein Objekt, auf das verwiesen wird, die von einem anderen class loader, und nicht Müll gesammelt, bis das Objekt von der garbage Collection eingesammelt.

Schließlich:
1) Wenn ich sehe 500 Zeilen in dem Bericht, der alle-Liste den gleichen Typ,
2) aber Sie Listen verschiedene class_loader Werte,
3) kann ich dann summieren sich die Werte in der Spalte bytes
4) und dieser wird exakt darstellen, wie viel der permgen space wird belegt durch Objekte dieses Typs.

Ist das richtig? Danke!

  • Ich sollte anmerken: Der Grund warum ich bin das bitten um Klärung hier ist, weil wenn ich davon ausgehe, dass die letzten zwei Absätze meiner Frage richtig sind, dann jmap berichtet, dass eine bestimmte Klasse Aufnahme mehrere hundert MB permgen; in der Erwägung, dass, wenn ich einen heap dump und suchen für die gleiche Klasse mit dem Eclipse Memory Analyzer Tool, es zeigt eine "Retained Heap" Größe von 25 Megabyte. Es gibt eine Lücke in meinem Verständnis, entweder von jmap oder von EMAT.
InformationsquelleAutor Michael | 2012-11-13
Schreibe einen Kommentar