2013-04-30 26 views
14

Ho eseguito il comando jmap -heap sul nostro applicazioni Java ed ecco quello che ho ottenuto:Stringhe internate non in permgen?

C: \ Program Files \ Java \ jdk1.7.0_05 \ bin> jmap -heap 2384 Collegamento per elaborare ID 2384, attendere ... Debugger collegato correttamente. Rilevatore server rilevato.
La versione JVM è 23.1-b03

utilizzando thread paralleli nella nuova generazione.
utilizzando l'allocazione di oggetti locali del thread.
Concurrent Mark-sweep GC

Heap di configurazione:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
newSize = 1.310.720 (1.25MB)
MaxNewSize = 17.592.186,044415 millions MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 134217728 (128.0MB)
01.235.164,106 milaMaxPermSize = 201.326.592 (192.0MB)
G1HeapRegionSize = 0 (0.0MB)

Uso Heap:
New Generation (Eden + 1 Survivor Spazio):
capacità = 228.261.888 (217.6875MB)
utilizzato = 203.794.000 (194.3531036376953MB)
libero = 24.467.888 (23.334396362304688MB)
89,28078260703775% utilizzato
Eden Spazio:
capacità = 202.964.992 (193.5625MB)
utilizzato = 198.399.360 (189.2083740234375MB) 0.123.509,529939 millions libera = 4.565.632 (4.3541259765625MB)
97,75053226913141% utilizzato
From Space:
capacità = 25.296.896 (24.125MB)
utilizzato = 5.394.640 (5.1447296142578125MB)
libero = 19.902.256 (18.980270385742188MB)
21,325304100550518% utilizzato
allo spazio:
capacità = 25.296.896 (24.125MB)
utilizzato = 0 (0.0MB)
libero = 25.296.896 (24.125MB)
0,0% utilizzato
concomitante generazione mark-sweep:
capacità = 506.445.824 (482.984375MB)
utilizzato = 159.479.408 (152.09141540527344MB)
libero = 346.966.416 (330.89295959472656MB)
31,489924576809226% utilizzato
Perm Generation:
capacità = 134217728 (128.0MB)
utilizzato = 72157448 (68.81470489501953MB)
gratuito = 62060280 (59.18529510498047MB)
53.76148819923401% utilizzato

96874 stringhe internate che occupano 89695496 byte.

Quindi sembra che ci siano circa 89mb di corde internate in 68mb di Permgen. Ci sono stringhe internate che non sono memorizzate nel Permgen?

+1

Perché ti interessa? Sospetto che tu stia cercando di microgestire. –

+0

@HotLicks - Perché stiamo avendo un'eccezione OOM di permgen e stavo cercando di escludere l'internamento delle stringhe. Più la curiosità ovviamente :) – Vic

risposta

22

Da Java 7 release notes:

In JDK 7, stringhe internati non sono più allocati nella generazione permanente del mucchio Java, ma sono invece assegnati parte principale del mucchio Java (nota come giovani e vecchi generazioni), insieme agli altri oggetti creati dall'applicazione. Questa modifica comporterà un maggior numero di dati nell'heap Java principale, e meno dati nella generazione permanente, pertanto potrebbe richiedere la regolazione delle dimensioni heap . La maggior parte delle applicazioni vedrà differenze relativamente piccole nell'uso dell'heap a causa di questa modifica, ma le applicazioni più grandi che caricano molte classi o utilizzano pesantemente il metodo String.intern() vedranno differenze più significative.

+1

Nota che questo era un cambiamento in java 7. Vedi anche la mia risposta [qui] (http://stackoverflow.com/a/14985144/758831) che ha alcuni link utili e indicazioni su come le cose stanno cambiando di nuovo in Java 8. – wmorrison365

+0

Grazie! Quindi l'unica cosa che rimane in permgen in Java 7 sono i classloader? – Vic

+0

I classloader insieme alle loro classi caricate. Non sono a conoscenza di altri cambiamenti relativi allo spazio PermGen da Java 6 a Java 7. – dcernahoschi

Problemi correlati