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:

  1. do czego odnosi się PSYoungGen? Zakładam, że ma to coś wspólnego z poprzednim (młodszym?) pokolenie, ale co dokładnie?
  2. Jaka jest różnica między drugim trypletem liczb i pierwszym?
  3. dlaczego nazwa (PSYoungGen)jest określona dla pierwszej trójki liczb, a nie dla drugiej?
  4. 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]

Author: Vadim Kotov, 2009-05-22

3 answers

Większość z nich jest wyjaśniona w GC Tuning Guide (Który i tak dobrze byś przeczytał).

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.

Nie jestem pewien, dlaczego w twoim jest PSYoungGen; zmieniłeś śmieciarkę?
 87
Author: Michael Myers,
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
  1. PSYoungGen odnosi się do garbage Collectora używanego do mniejszej kolekcji. PS to skrót od Parallel Scavenge.
  2. 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)
  3. 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
 120
Author: michaeljoseph,
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!

 22
Author: Andrei,
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