2013-04-01 14 views
8

Podczas monitorowania programu java za pomocą VisualVM, zauważyłem interesujący wzorzec w zachowaniu śmieciarza. Wydaje się, że bardzo często, zaraz po przeprowadzeniu "normalnego" cyklu zbierania śmieci, GC wykonuje drugi, o wiele bardziej intensywny proces cpu, który wydaje się nie mieć żadnego dodatkowego efektu (Stosowana kupa po bardziej agresywnym przebiegu jest mniej więcej taka sama jak to jest po lżejszym uruchomieniu).Dlaczego moduł usuwania śmieci Java wydaje się wykonywać agresywny przebieg krótko po wykonaniu mniej agresywnego?

Wskazałem na wyjściu VisualVM, gdzie można zobaczyć, jak działa sortownik śmieci i odpowiednie zmiany wykorzystania sterty.

interesting garbage collector behaviour

Moje pytanie jest w zasadzie to, co jest garbage collector tu robi i dlaczego? Co powoduje próbę wykonywania naprawdę intensywnych cpu, gdy jest dużo wolnej pamięci i nie ma zauważalnych korzyści w porównaniu z lżejszymi przebiegami? Czy źle interpretuję wykres?

Wydajność programu nie jest tak naprawdę zmieniona, jestem po prostu ciekawa.

+1

Wątpię, czy ktokolwiek tutaj będzie w stanie odpowiedzieć "dlaczego". Prawdopodobnie będziesz musiał odczytać kod źródłowy JVM, aby dowiedzieć się, i może się on zmienić w dowolnym momencie. –

+1

@JimGarrison Wydaje mi się, że musi być co najmniej jeden użytkownik SO, który pracował nad JVM na tyle, aby odpowiedzieć na pytanie ;-) – bdesham

Odpowiedz

2

Patrząc na wykresy, warto przejrzeć przebiegi GC, ale jeśli chcesz dowiedzieć się, dlaczego GC działa w danym momencie, , musisz zagłębić się w logach GC.

Włącz pełne rejestrowanie GC, zacznij także kolekcjonować jstat. Skoncentruj się na tych czasach, w których widzisz niespodziewane cykle GC i śledź je w dziennikach. Co tam widzisz? Spróbuj zobaczyć:

  • czy jest to pełny czy mniejszy GC?
  • czym są zawody eden, perm, oldGen, przestrzenie ocalałe, itp?
  • jakie są stawki przydziału, rozmiar zestawu danych na żywo, stawki promocyjne w tych odstępach czasu?
  • itp

Odpowiedź na te pytania może prowadzić do problemu, dlaczego GC jest uruchomiony.

AKTUALIZACJA: można znaleźć szczegóły techniczne dotyczące regulacji GC, np. w: Is there a cookbook guide for GC problems?

+1

Aby rozwinąć nieco, możesz użyć -verbose: gc i -XX: + PrintGCDetails naprawdę zagłębić się w to dalej. –

+1

Aby uzyskać więcej informacji o GC, możesz wypróbować wtyczkę VisualGC dla VisualVM. –

Powiązane problemy