2013-04-30 12 views
14

Zabrakło mi komendę jmap -heap na naszej uruchomionej aplikacji Java i oto co mam:Internowane ciągi nie w permgen?

C: \ Program Files \ Java \ jdk1.7.0_05 \ bin> jmap -heap 2384 Dołączanie do przetwarzania identyfikator 2384, proszę czekać ... Debugger dołączony pomyślnie. Wykryto kompilator serwera.
Wersja JVM to 23,1-b03

wykorzystująca równoległe wątki w nowej generacji.
przy użyciu alokacji obiektu wątku lokalnego.
współbieżne Marka-odchylenia GC

stosu Konfiguracja:
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 = 201326592 (192.0MB)
G1HeapRegionSize = 0 (0.0MB)

stosu Zastosowanie:
nowej generacji (Eden + 1 przeżył przestrzeni)
wydajność = 228261888 (217.6875MB)
stosowane = 203.794.000 (194.3531036376953MB)
wolna = 24467888 (23.334396362304688MB)
+89,28078260703775% wykorzystywane
Eden Miejsce:
wydajność = 202964992 (193.5625MB)
stosowane = 198399360 (189.2083740234375MB)
wolna = 4565632 (4.3541259765625MB)
+97,75053226913141% wykorzystywane
Od przestrzeni:
wydajność = 25296896 (24.125MB)
stosowane = 5394640 (5.1447296142578125MB)
wolna = 19902256 (18.980270385742188MB)
21,325304100550518% stosuje
Space:
wydajność = 25296896 (24.125MB)
stosowane = 0 (0.0MB)
wolna = 25296896 (24.125MB)
0,0% wykorzystywane
współbieżne generowanie narzut przemiatania
wydajność = 506445824 (482.984375MB)
stosowane = 159479408 (152.09141540527344MB)
wolna = 346966416 (330.89295959472656MB)
+31,489924576809226% wykorzystywane
Dopuszczalna wygenerowana
wydajność = 134217728 (128,0MB)
używany = 72157448 (68.81470489501953MB)
bezpłatnie = 62060280 (59,18529510498047MB)
53.76148819923401% użyte

96874 internowane Struny zajmujące 89695496 bajtów.

Wygląda na to, że istnieje około 89 MB internowanych ciągów w 68 MB Permgen. Czy są internowane ciągi, które nie są przechowywane w Permgen?

+1

Dlaczego miałbyś ochotę? Podejrzewam, że próbujesz mikromanażu. –

+0

@HotLicks - Ponieważ mamy wyjątki OOM o permen i próbowałem wykluczyć interakcje ciągów. Plus ciekawość oczywiście :) – Vic

Odpowiedz

22

Od Java 7 release notes:

W JDK 7, internowani struny nie są już przydzielone w stałego generacji sterty Java, ale zamiast tego są przydzielane w głównej części sterty Java (znany jako młode i stare generacje ), wraz z innymi obiektami stworzonymi przez aplikację. Ta zmiana spowoduje, że więcej danych będzie przechowywanych w głównej kupce Java, , a mniej danych w generowaniu ciągłym, a zatem może wymagać dostosowania rozmiarów sterty . Większość aplikacji zauważy tylko stosunkowo niewielkie różnice w stosowaniu sterty spowodowane tą zmianą, ale większe aplikacje , które ładują wiele klas lub intensywnie korzystają z metody String.intern() , zobaczą większe różnice.

+1

Zauważ, że to była zmiana w java 7. Zobacz także moją odpowiedź [tutaj] (http://stackoverflow.com/a/14985144/758831), która ma kilka przydatnych linków i wskazówek, jak rzeczy zmieniają się ponownie w java 8. – wmorrison365

+0

Dzięki! Jedyne co pozostało w permgen w Javie 7 to programy ładujące klasy? – Vic

+0

Program ładujący klasy wraz z załadowanymi klasami. Nie jestem świadomy innych zmian dotyczących przestrzeni PermGen z Java 6 do Java 7. – dcernahoschi

Powiązane problemy