sobota, grudnia 26, 2009

Nieznane ścieżki Garbage Collectora :-)

Dziwną rzecz dziś widziałem.
Jedna zmiana w kodzie programu, polegająca na wyprowadzeniu pewnej kolekcji poza metodę i uczynienie jej elementem globalnym spowodowało, że mój program pewien swój fragment zamiast 14-20 sekund wykonywał o wiele dłużej [jakieś 100-140 sekund] z czego wszystek czas poza tymi 14-20 sekundami przypadał na wątek Garbage Collectora :-)
Idea była taka: ponieważ mój program do wyliczania podobnych postów 2 razy pobiera wszystkie wpisy z bloga z sieci to może jak już je raz pobierze to potrzymać je w pamięci i nie pobierać za drugim razem, wg. teorii miało to zaoszczędzić te parę-paręnaście sekund zużywane na pobranie wszystkich postów bloga z sieci.
Okazało się jednak, że spowodowało to spadek wydajności :-)

Czemu?
Bo wszystkie zmienne, łącznie z tą kolekcją zawierającą wszystkie posty trafiły w okolice limitów pamięci przydzielonych JVM, przez co JVM próbowała co chwilę odzyskiwać pamięć.... ale że nie miała z czego to każdy przebieg GC był przebiegiem pustym, który pamięci nie odzyskiwał, za to zabierał czas.

Nauczka na przyszłość jest taka, że gdy program nagle spowalnia to trzeba się przyjrzeć przy pomocy JCONSOLE czy aby nie ma właśnie takich problemów :-)


Podobne postybeta
Nieznane skarby JDK - JConsole :-)
Koszmarny Garbage Collector ;-)
Filmy
Koszmarne Garbage Collectory part 2 ;)
Moja własna akcja w Google Home ;-)