encyklopedia.space

Garbage collection

Garbage collection (pol. automatyczna zbiórka śmieci) to technika zarządzania pamięcią stosowana w systemach programistycznych, której celem jest automatyczne zwalnianie pamięci zajmowanej przez obiekty, do których nie istnieją już żadne odwołania w programie. Dzięki temu programista nie musi ręcznie zwalniać pamięci, co znacznie zmniejsza ryzyko wystąpienia błędów takich jak wycieki pamięci (memory leaks) czy użycie zwolnionego obszaru (dangling pointers).

Historia

Pierwsze koncepcje automatycznej zbiórki śmieci pojawiły się w latach 50. i 60. XX wieku w języku Lisp, w którym John McCarthy opracował algorytm mark-and-sweep. W następnych dekadach technika została zaadaptowana w innych językach, m.in. w Java, C#, Python oraz w nowoczesnych systemach operacyjnych.

Podstawowe algorytmy

Istnieje kilka głównych podejść do realizacji garbage collection:

  • Reference counting – każdy obiekt posiada licznik odwołań; gdy licznik spadnie do zera, obiekt jest natychmiast zwalniany. Metoda jest prosta, ale nie radzi sobie z cyklami referencji.
  • Mark-and-sweep – dwufazowy algorytm: w fazie mark odznacza wszystkie obiekty dostępne z korzeni (np. stosu, rejestrów), a w fazie sweep zwalnia nieoznaczone obiekty.
  • Copying collector – pamięć jest podzielona na dwie półki; podczas zbiórki wszystkie żywe obiekty są kopiowane do drugiej półki, a pierwsza zostaje całkowicie zwolniona.
  • Generational collection – zakłada, że większość obiektów jest krótkotrwała. Pamięć jest podzielona na „generacje”, a zbiórka najpierw dotyczy młodszych generacji, co przyspiesza działanie.
  • Incremental i concurrent collector – podział procesu zbiórki na małe fragmenty wykonywane równolegle z działaniem programu, co minimalizuje przestoje (pause times).

Implementacje w językach programowania

Różne języki implementują garbage collection na różne sposoby:

  • Java – wykorzystuje połączenie generationalparallel/concurrent collectorów, które można konfigurować przy uruchamianiu JVM.
  • C# – system .NET CLR stosuje generacyjną, współbieżną zbiórkę, z obsługą ephemeral generations.
  • Python (CPython) – łączy reference counting z periodicznym generational collector obsługującym cykle.
  • Go – posiada trójstopniowy algorytm: tiny allocator, mark‑and‑sweep oraz generational fazę, wszystkie wykonywane współbieżnie.
  • Ruby – w implementacji MRI używa mark‑and‑sweep, w JRuby opiera się na garbage collectorze JVM.

Zalety i wady

Automatyczna zbiórka śmieci przynosi wiele korzyści, ale nie jest pozbawiona ograniczeń.

Zalety

  • Redukcja błędów pamięciowych – programista nie musi ręcznie zwalniać pamięci.
  • Ułatwione programowanie wielowątkowe – brak potrzeby synchronizacji przy zwalnianiu zasobów.
  • Lepsza stabilność aplikacji – mniejsze ryzyko wycieków pamięci i awarii.

Wady

  • Nieprzewidywalny czas przestoju (pause time) podczas pełnej zbiórki.
  • Zużycie dodatkowej pamięci (np. podział na generacje, kopie przy copying collector).
  • Możliwość zwiększenia ogólnego zużycia procesora w czasie działania zbieracza.

Powiązane pojęcia

Więcej informacji można znaleźć w następujących artykułach:

Bibliografia

Podstawowe pozycje literaturowe i materiały źródłowe:

  • J. McCarthy, Garbage Collection: A History and Overview, 1960.
  • G. Jones, Garbage Collection: Algorithms for Automatic Dynamic Memory Management, 1996.
  • Oraz dokumentacje języków: Java, C#, Python.