Java Garbage Collection Log messages
Skonfigurowałem Javę do wrzucania informacji o zbieraniu śmieci do logów ( verbose GC ). Nie jestem pewien, co oznaczają wpisy dotyczące zbierania śmieci w dziennikach. Przykładowe z tych wpisów zamieszczamy poniżej. Szukałem na Google i nie znalazłem solidnych wyjaśnień.
Mam kilka rozsądnych domysłów, ale szukam odpowiedzi, które zapewnią ścisłe definicje tego, co oznaczają liczby we wpisach, poparte wiarygodnymi źródłami. Automatyczny + 1 do wszystkie odpowiedzi, które powołują się na dokumentację sun. Moje pytania to:
- do czego odnosi się PSYoungGen? Zakładam, że ma to coś wspólnego z poprzednim (młodszym?) pokolenie, ale co dokładnie?
- Jaka jest różnica między drugim trypletem liczb i pierwszym?
- dlaczego nazwa (PSYoungGen)jest określona dla pierwszej trójki liczb, a nie dla drugiej?
- co oznacza każda liczba (wielkość pamięci) w tryplecie. Na przykład w 109884K->14201K(139904k), czy pamięć jest przed GC 109884k, a następnie jest zmniejszona do 14201K. w jaki sposób trzecia liczba ma znaczenie? Po co nam drugi zestaw liczb?
8109.128: [Gc [PSYoungGen: 109884k - >14201K(139904K)] 691015K - >595332K(1119040K), 0.0454530 secs]
8112.111: [Gc [PSYoungGen: 126649k - >15528K(142336K)] 707780K- > 605892K(1121472K), 0.0934560 secs]
8112.802: [Gc [PSYoungGen: 130344k - >3732K(118592K)] 720708K- > 607895K(1097728K), 0.0682690 secs]
3 answers
Większość z nich jest wyjaśniona w GC Tuning Guide (Który i tak dobrze byś przeczytał).
Nie jestem pewien, dlaczego w twoim jest PSYoungGen; zmieniłeś śmieciarkę?Opcja wiersza poleceń
-verbose:gc
powoduje, że informacje o stercie i zbiorze śmieci są drukowane przy każdej kolekcji. Na przykład, tutaj jest wyjście z dużej aplikacji serwera:[GC 325407K->83000K(776768K), 0.2300771 secs] [GC 325816K->83372K(776768K), 0.2454258 secs] [Full GC 267628K->83769K(776768K), 1.8479984 secs]
Tutaj widzimy dwa zbiory Pomniejsze, po których następuje jeden zbiór główny. Liczby przed i za strzałką (np.
325407K->83000K
z pierwszego wiersza) wskazują łączny rozmiar żywych obiektów przed i po garbage collection, odpowiednio. Po mniejszych kolekcjach Rozmiar obejmuje niektóre obiekty, które są śmieciami (już nie żyją), ale których nie można odzyskać. Obiekty te są albo zawarte w pokoleniu dzierżawnym, albo odwołują się do pokoleń dzierżawnych lub trwałych.Następna liczba w nawiasach (np.
(776768K)
Ponownie z pierwszej linii) to wielkość stosu: ilość miejsca użytkowego dla obiektów java bez żądania więcej pamięć z systemu operacyjnego. Należy pamiętać, że liczba ta nie obejmuje jednej ze spacji survivor, ponieważ tylko jedna może być używana w danym momencie, a także nie obejmuje stałego generowania, które zawiera metadane używane przez maszynę wirtualną.Ostatni element w linii (np.
0.2300771 secs
) wskazuje czas potrzebny na wykonanie zbioru; w tym przypadku około ćwierć sekundy.Format głównej kolekcji w trzeciej linii jest podobny.
Format produkcji
-verbose:gc
może ulec zmianie w przyszłych wydaniach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-04 04:47:18
- PSYoungGen odnosi się do garbage Collectora używanego do mniejszej kolekcji. PS to skrót od Parallel Scavenge.
- pierwszy zbiór liczb jest wielkością przed / po młodego pokolenia, a drugi zestaw jest dla całej sterty. ( diagnozowanie problemu ze zbiórką śmieci określa format)
- nazwa wskazuje na daną generację i kolektor, drugi zestaw dotyczy całej sterty.
Przykład powiązanego pełnego GC również pokazuje kolektory używane dla starych i trwałych pokoleń:
3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)]
[ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K)
[PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]
Na koniec podzielenie jednego wiersza przykładowego wyjścia dziennika:
8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
- 107mb używane przed GC, 14MB używane po GC, max rozmiar młodego pokolenia 137Mb
- 675mb sterta używana przed GC, 581mb sterta używana po GC, 1GB maksymalny rozmiar sterty
- Minor GC wystąpił 8109.128 sekund od startu JVM i wziął 0.04 seconds
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-04 04:53:47
Chciałem tylko wspomnieć, że można uzyskać szczegółowy dziennik GC za pomocą
-XX:+PrintGCDetails
Parametr. Następnie zobaczysz wyjście PSYoungGen lub PSPermGen, jak w odpowiedzi.
Również -Xloggc:gc.log
wydaje się generować to samo wyjście jak -verbose:gc
, ale możesz określić plik wyjściowy w pierwszym.
Przykładowe użycie:
java -Xloggc:./memory.log -XX:+PrintGCDetails Memory
Aby lepiej wizualizować dane, możesz wypróbować gcviewer (nowszą wersję można znaleźć na github).
Zadbaj o to, aby napisać parametry poprawnie, zapomniałem " + " i mój JBoss nie uruchomi się, bez żadnego komunikatu o błędzie!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-16 09:27:21