Sobes.tech
Junior

Czym jest garbage collector w C#?

sobes.tech AI

Odpowiedź od AI

Garbage collector w C# to zautomatyzowany proces zarządzania pamięcią. Zwolni pamięć zajmowaną przez obiekty, które nie są już używane przez aplikację.

Kluczowe aspekty:

  • Automatyczne zarządzanie: Programista nie musi ręcznie przydzielać ani zwalniać pamięci dla większości obiektów. CLR (Common Language Runtime) robi to automatycznie.
  • Śledzenie referencji: Garbage collector określa, które obiekty są dostępne z źródeł korzeniowych (np. stosów wątków, pól statycznych). Obiekty bez referencji z tych źródeł są uważane za nieosiągalne i są zbierane.
  • Pokolenia: Heap (stos) jest podzielony na pokolenia (0, 1 i 2). Obiekty, które "przetrwają" po zbieraniu, są przenoszone do wyższych pokoleń. Optymalizuje to proces, ponieważ większość obiektów żyje krótko.
  • Finalizacja: Obiekty mogą mieć metodę Finalize, którą wywołuje garbage collector przed zwolnieniem pamięci. Używana do czyszczenia niezarządzanych zasobów, ale jej stosowanie jest ograniczone ze względu na nieprzewidywalny czas wykonania.
  • Kompakcja: Po zbieraniu garbage collector może przesuwać przetrwałe obiekty, aby zmniejszyć fragmentację pamięci.
// Przykład tworzenia obiektu na zarządzanym stosie
MyClass obj = new MyClass();
// Gdy nie ma już odniesień do obj, garbage collector może zwolnić pamięć

// Przykład ręcznego zwalniania niezarządzanych zasobów za pomocą IDisposable i using
// Zalecane podejście zamiast Finalize
using (var resource = new UnmanagedResourceWrapper())
{
    // Użycie zasobu
} // Tutaj wywoływane jest resource.Dispose(), czyszcząc niezarządzany zasób