Wysypisko śmieci.

Garbage CollectorNasz wspaniały język C#, znosi z nas prawie pełną odpowiedzialność za sprzątanie po sobie.

Można by rzec, iż mamy zatrudnioną sprzątaczkę i nawet nie wiemy kiedy magicznie bałagan znika. Oczywiści mowa tutaj o Garbage Collector.

Jeszcze dzisiaj pamiętam trudność, i obowiązek kontrolowania wycieków pamięci gdy pisałem oprogramowanie z wykorzystaniem języka C++.

Z drugiej strony człowiek był bardziej odpowiedzialny za to co się działo w kodzie.

Teraz w dobie ogromnych pamięci RAM, GC, często można  zapomnieć o wyciekach pamięci.

 

Działanie

Alokowanie pamięci odbywa się niejako w dwóch miejscach:

  • na stosie (Stack) – zarządzaniem zajmuje się CLR (Common Language Runtime), i zawiera referencje do faktycznie utworzonych obiektów na stercie,
  • na sterta (Heap) –  zarządzaniem zajmuje się GC.

 

Śmietnik działa  bardzo sprytnie, w pierwszej fazie (Mark) znakuje obiekty jakie są używane -> istnieją powiązane z obiektem referencje (Stack -> Heap),  po czym  zaznacza je.

Tak oznaczone obiekty nie zostaną usunięte w fazie drugiej (Sweep).

Tym sposobem dochodzimy do nazwy stosowanego w GC algorytmu -> Mark & Sweep.

 

Aplikacje składają  się z wielu obiektów, i proces czyszczenia może trwać dość długo, zależnie od ilości obiektów. Dlatego nie jest on często uruchamiany.

Automatyczne wyzwoleni GC następuje w sytuacji gdy zostanie przekroczony pewien zakres pamięci.

 

Generacje

GC kategoryzuje obiekty według ich wieku powstania, tym samym przydzielane są do odpowiednich pokoleń oznaczanych odpowiednio 0, 1, 2.

Zmiana pokolenia następuje podczas uruchomienia GC, awans w pokoleniu następuje gdy obiekt nie nadaje się do zniszczenia.Garbage Collector

Jeżeli obiekt jest potrzebny i są do niego powiązane referencje ze stosu na stertę to wówczas jest on ważny i podbijana jest jego ranka od 0 do 2.

Do generacji przydzielany jest budżet, dla 0 przyjmuje się wielkość 256 KB, w przypadku przekroczenia podczas  alokowanie nowego obiektu następuje uruchomienie czyszczenia na generacji 0, w tym czasie istnieje duża szansa, iż część obiektów nadaje się do zniszczenia lub awansu na wyższe pokolenie.

Po przeczyszczeniu następuje ponowna próba alokacji jeżeli się nie powiedzie to automatycznie obiekt awansuje do wyższej generacji.

Generacja zerowa jest miejscem gdzie obiekty są najczęściej tworzone i niszczone, dlatego też jej wielkość 256 KB, jest obszarem, który powinien z łatwością zmieścić się w pamięci  L2 – cache procesora.

 

C.D.N.

 

Jest to post przygotowany na potrzeby konkursu „Daj Się Poznać 2017” organizowanym przez Macieja Aniserowicza.