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.
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.
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. –
@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