2013-01-23 22 views
6

Jak widać poniżej, pośród wszystkiego działającego zgodnie z oczekiwaniami, operacja GC zatrzymująca świat trwała +60 sekund. Można by się zdecydować na zatrzymanie świata przez cały czas, ponieważ spadli klienci (z terakoty), narzekając (serwer z terakoty) nie zareagował w tym czasie.JVM minuta długa GC

Czy to młody/nieletni GC? Jeśli tak, to czy może z powodu głodu w młodym pokoleniu (eden + ocaleni?).

Czy tylko 109333 (KB) zostanie zwolnione?

Zacznę tworzyć wykresy różnych pojemników z pamięcią, inne sugestie, co można zrobić, aby dalej diagnozować takie problemy?

date, startMem=24589884, endMem=24478495, reclaimed=111389, timeTaken=0.211244 (1172274.139: [GC 24589884K->24478495K(29343104K), 0.2112440 secs]) 
date, startMem=24614815, endMem=24505482, reclaimed=109333, timeTaken=61.301987 (1172276.518: [GC 24614815K->24505482K(29343104K), 61.3019860 secs]) 
date, startMem=24641802, endMem=24529546, reclaimed=112256, timeTaken=2.68437 (1172348.921: [GC 24641802K->24529546K(29343104K), 2.6843700 secs]) 

Sun JVM 1,6, stosując następującą konfiguracji:

-Xms28672m -Xmx28672m -xx: + UseConcMarkSweepGC -XX: + PrintGCTimeStamps -XX: + PrintGC

Sane Ustawienia konfiguracji do dalszego debugowania GC:

'-XX:+PrintGCDateStamps' Print date stamps instead of relative timestamps 
'-XX:+PrintGCDetails' Will show what cpu went for (user, kern), gc algorithm used 
'-XX:+PrintHeapAtGC' will show all of the heaps memory containers and their usage 
'-Xloggc:/path/to/dedicated.log' log to specific file 
+0

Co robi Twoja aplikacja? Jitter GC występuje wtedy, gdy duże ilości pamięci są odzyskiwane ze sterty podczas wielokrotnego przeciągania, prawdopodobnie każde przeciągnięcie powoduje, że więcej obiektów kwalifikuje się do zbierania, co prowadzi do dalszych przemiatnięć. Nawet 2-sekundowy przebieg, który pokazujesz, to ogromna ilość czasu, który GC musi wykonać. Myślę, że zmienisz sposób, w jaki aplikacja obsługuje obiekty, a nie konfiguracja JVM będzie ścieżką, którą musisz wykonać. Każda aplikacja, która musi utrzymać GC jitter w dół powinna szukać raczej ponownego użycia niż ponownego przydzielania obiektów. – codeghost

+0

To jest magazyn sesji (cookie). Liczby, na przykład "odzyskane", wskazują, że niewiele pamięci zostało odzyskanych. Jeśli tak, dobrze jest wiedzieć, dlaczego. Całkowicie się z Tobą zgadzam, że musi być rozwiązany, w jaki sposób obsługiwane są (sesyjne) obiekty, co zawierają itp. Jest lepszy proces obsługi sesji, ale na razie mam zadanie, aby dowiedzieć się, dlaczego GC zajęłoby +60 sekund i nadal nie ma wolnej pamięci więcej niż poprzednie 0.2s gc. – user135361

+2

Spójrz na ten blog http://kirk.blog-city.com/why_do_i_have_this_long_gc_pause.htm może dać ci kilka wskazówek. – codeghost

Odpowiedz

1

-XX:+UseConcMarkSweepGC Włącza zbieranie jednoczesnych

Default Vs. CMS

Całkowity czas podjętą to suma faz stop-the-world (JVM zablokowany) i faz współbieżnych (JVM wykonywanie kodu użytkownika).

Należy włączyć szczegółowe rejestrowanie GC w celu dokładniejszego zbadania, ponieważ nie masz informacji o tym, ile z tych +60 sekund blokuje maszynę JVM.

+0

Już wyjaśniłem, że zostanie zapisany bardziej szczegółowy wynik. Nie chodzi o to, jak działa CMS, ale raczej o to, w jakich okolicznościach nastąpiłby długi postój na świecie. JVM została zablokowana przez cały czas, więc jest to "główny GC" i prawdopodobnie jest z powodu defragmentacji. Jeśli tak, pytanie brzmi: jak mogę się dowiedzieć, czy dodanie więcej sterty pomoże, lub w jakich przypadkach zaplanowanie cms spowoduje wczytanie wcześniejszej pomocy. Doceniam twoją próbę, ale będziesz musiał podjąć decyzję o wyodrębnieniu czynników, zanim cię przekażę. – user135361

+2

Skąd wiesz, że JVM została zablokowana przez cały czas bez szczegółowego dziennika? Powinieneś dodać do pytania wszystkie posiadane informacje. – fglez

+0

dobry punkt, aktualizowanie. – user135361