Skąd garbage collector wie, który obiekt można usunąć z pamięci?

Czym jest i co robi Garbage Collector?

Jedną z licznych zalet języka Java jest brak konieczności zarządzania pamięcią maszyny, na której uruchamiany jest program. Nie oznacza to jednak, że Java ten problem ignoruje. Zajmuje się nim tzw. garbage collector, który pracuje w tle w trakcie działania programu. Jego głównym zadaniem jest zbieranie i usuwanie obiektów, których program javowy nie będzie już potrzebował. 

Co istotne, garbage collector działa równolegle z programem, sam w sobie nie jest jego częścią. Jednak nie od zawsze tak jest. W przeszłości garbage collector uruchamiany był w tym samym wątku co program. Co kilka minut zbierał i usuwał zbędne obiekty. Oczywiście w tym momencie program nie mógł być wykonywany. Z czasem praca garbage collectora została wyniesiona do osobnego wątku.

Skąd garbage collector wie, że obiekt nie będzie już potrzebny?

Często słyszy się, że obiekt jest niszczony, gdy żaden inny obiekt nie przechowuje do niego referencji. W rzeczywistości nie byłoby to zbyt efektywne, ponieważ obiekty mogą przechowywać referencje do siebie nawzajem. Na poniższym obrazku trzy obiekty przechowują do siebie referencje, podczas gdy pozostała część programu nie potrzebuje ich do pracy.

Garbage Collector - referencje do obiektów

Gdyby garbage collector zliczał referencje w celu wyznaczenia kandydatów do usunięcia, powyższe obiekty pozostały by w pamięci. Jednak decyzja o usunięciu obiektu zapada w oparciu o osiągalność obiektu. Obiekty dzieli się na dwie grupy – osiągalne (reachable) i nieosiągalne (unreachable). 

Obiekt klasyfikowany jest jako osiągalny wtedy, gdy inny osiągalny obiekt przechowuje do niego referencję. 

Innymi słowy, jeśli da się „prześledzić” ścieżkę od danego obiektu do obiektu pierwotnego (tworzonego bezpośrednio w kodzie wykonywalnym), traktujemy go jako obiekt osiągalny.

Garbage Collector -ścieżki do obiektów

Na powyższym rysunku żaden z obiektów w aktualnie wykonywanym kodzie nie przechowuje referencji do obiektów oznaczonych kolorem czerwonym. W rezultacie te trzy obiekty zostaną odpowiednio oznaczone i przejęte przez garbage collector.

Popularne pytanie na rozmowach rekrutacyjnych

Pytanie o działanie garbage collectora jest bardzo popularne na rozmowach rekrutacyjnych zarówno dla programistów jak i testerów oprogramowania, dlatego warto przypomnieć sobie to zagadnienie przed rekrutacjami.