2013-04-30 4 views
14

Ich habe laufen ist das jmap -heap Befehl auf unsere laufenden Java-Anwendung und hier, was ich habe:Internierte Strings nicht in Permgen?

C: \ Programme \ Java \ jdk1.7.0_05 \ bin> jmap -heap 2384 Anbringen ID zu verarbeiten 2384, bitte warten ... Debugger erfolgreich angehängt. Server-Compiler erkannt.
JVM-Version ist 23.1-b03

mit parallelen Threads in der neuen Generation.
mit thread-lokalen Objektzuordnung.
Concurrent Mark-Sweep GC

Heap Konfiguration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 134217728 (128.0MB)
MaxPermSize = 201.326.592 (192.0MB)
G1HeapRegionSize = 0 (0.0MB)

Heap-Verbrauch:
New Generation (Eden + 1 Survivor Raum):
capacity = 228.261.888 (217.6875MB)
verwendet = 203794000 (194.3531036376953MB)
frei = 24.467.888 (23.334396362304688MB)
89,28078260703775% verwendet
Eden Raum:
capacity = 202.964.992 (193.5625MB)
verwendet = 198.399.360 (189.2083740234375MB)
frei = 4.565.632 (4.3541259765625MB)
97,75053226913141% verwendet
From Space:
capacity = 25296896 (24.125MB)
verwendet = 5.394.640 (5.1447296142578125MB)
frei = 19902256 (18.980270385742188MB)
21,325304100550518% verwendet
Um Raum:
capacity = 25.296.896 (24.125MB)
verwendet = 0 (0.0MB)
frei = 25.296.896 (24.125MB)
0,0% verwendet
gleichzeitige mark-sweep Generation:
capacity = 506.445.824 (482.984375MB)
verwendet = 159.479.408 (152.09141540527344MB)
frei = 346.966.416 (330.89295959472656MB)
31,489924576809226% verwendet
Perm Generation:
capacity = 134217728 (128.0MB)
verwendet = 72157448 (68.81470489501953MB)
frei = 62060280 (59.18529510498047MB)
53.76148819923401% verwendet

96874 interned Strings besetzt 89695496 Bytes.

Es scheint also, als gäbe es etwa 89 MB internierte Strings in 68MB Permgen. Gibt es internierte Strings, die nicht im Permgen gespeichert sind?

+1

Warum interessiert Sie das überhaupt? Ich vermute, du versuchst Mikromanagement. –

+0

@HotLicks - Weil wir eine permgen OOM-Ausnahmen haben und ich versuchte String-Interning auszuschließen. Plus die Neugier natürlich :) – Vic

Antwort

22

Von Java 7 release notes:

In JDK 7 sind interniert Strings nicht zugeordnet mehr in der permanente Erzeugung des Java Heap werden, sondern in der Hauptteil des Java Heap (bekannt als die zugewiesene jung und alt Generationen), zusammen mit den anderen von der Anwendung erstellten Objekten. Diese Änderung führt dazu, dass mehr Daten im Haupt-Java-Heap gespeichert werden, und weniger Daten in der permanenten Generierung. Daher müssen möglicherweise die Heap-Größen angepasst werden. Die meisten Anwendungen sehen aufgrund dieser Änderung nur relativ kleine Unterschiede in der Heap-Verwendung, aber größere Anwendungen , die viele Klassen laden oder die String.intern() -Methode verwenden, werden größere Unterschiede feststellen.

+1

Beachten Sie, dass dies eine Änderung in Java 7 war. Siehe auch meine Antwort [hier] (http://StackOverflow.com/A/14985144/758831), die einige nützliche Links und Hinweise auf Dinge hat ändern sich wieder in Java 8. – wmorrison365

+0

Danke! Das einzige, was in Java 7 permgen bleibt, sind Klassenlader? – Vic

+0

Die Klassenlader zusammen mit ihren geladenen Klassen. Mir sind keine weiteren Änderungen in Bezug auf den PermGen-Bereich von Java 6 bis Java 7 bekannt. – dcernahoschi