.NET Core - wyrzucanie elementów bezużytecznych
W tym rozdziale zajmiemy się koncepcją czyszczenia pamięci, która jest jedną z najważniejszych funkcji platformy kodu zarządzanego .NET. Moduł odśmiecania pamięci (GC) zarządza alokacją i zwalnianiem pamięci. Moduł odśmiecania służy jako automatyczny menedżer pamięci.
- Nie musisz wiedzieć, jak przydzielać i zwalniać pamięć ani zarządzać okresem życia obiektów, które używają tej pamięci 
- Alokacja jest dokonywana za każdym razem, gdy deklarujesz obiekt za pomocą słowa kluczowego „new” lub umieszczasz w ramce typ wartości. Alokacje są zazwyczaj bardzo szybkie 
- Gdy nie ma wystarczającej ilości pamięci do przydzielenia obiektu, GC musi zebrać i usunąć pamięć bezużyteczną, aby udostępnić pamięć dla nowych alokacji. 
- Ten proces jest znany jako garbage collection. 
Zalety zbierania śmieci
Usługa Garbage Collection zapewnia następujące korzyści -
- Nie musisz ręcznie zwalniać pamięci podczas tworzenia aplikacji. 
- Efektywnie przydziela również obiekty na zarządzanej stercie. 
- Gdy obiekty nie są już używane, odzyskuje te obiekty, czyszcząc ich pamięć i zachowując pamięć dostępną dla przyszłych alokacji. 
- Zarządzane obiekty automatycznie uzyskują czystą zawartość na początku, więc ich konstruktorzy nie muszą inicjować każdego pola danych. 
- Zapewnia również bezpieczeństwo pamięci, upewniając się, że obiekt nie może używać zawartości innego obiektu. 
Warunki wyrzucania elementów bezużytecznych
Wyrzucanie elementów bezużytecznych występuje, gdy spełniony jest jeden z następujących warunków.
- System ma mało pamięci fizycznej. 
- Pamięć używana przez przydzielone obiekty na zarządzanej stercie przekracza dopuszczalny próg. Ten próg jest stale dostosowywany w trakcie procesu. 
- Plik GC.Collectmetoda jest wywoływana iw prawie wszystkich przypadkach nie musisz wywoływać tej metody, ponieważ moduł odśmiecania pamięci działa w sposób ciągły. Ta metoda jest używana głównie w wyjątkowych sytuacjach i podczas testów. 
Pokolenia
NET ma 3 generacje, a każda generacja ma własną stertę, która jest używana do przechowywania przydzielonych obiektów. Istnieje podstawowa zasada, że większość obiektów jest albo krótkotrwała, albo długowieczna.
Pierwsza generacja (0)
- W generacji 0 obiekty są najpierw przydzielane. 
- W tej generacji obiekty często nie żyją po pierwszej generacji, ponieważ nie są już używane (poza zakresem) do czasu następnego czyszczenia pamięci. 
- Generację 0 można szybko zebrać, ponieważ powiązana z nią sterta jest niewielka. 
Generacja druga (1)
- W Generacji 1 obiekty mają pole drugiej szansy. 
- Obiekty, które są krótkotrwałe, ale przetrwały kolekcję generacji 0 (często oparte na przypadkowym czasie), przechodzą do generacji 1. 
- Kolekcje generacji 1 są również szybkie, ponieważ powiązany z nimi stos jest również niewielki. 
- Pierwsze dwa sterty pozostają małe, ponieważ obiekty są zbierane lub promowane do sterty następnej generacji. 
Trzecia generacja (2)
- W generacji 2 żyją wszystkie długie obiekty, a ich stos może urosnąć do bardzo dużego. 
- Obiekty tej generacji mogą przetrwać długi czas i nie ma stosu następnej generacji, który mógłby dalej promować obiekty. 
- Garbage Collector posiada dodatkową stertę dla dużych obiektów zwaną Large Object Heap (LOH). 
- Jest zarezerwowany dla obiektów, które mają 85 000 bajtów lub więcej. 
- Duże obiekty nie są przydzielane do pryzm pokoleniowych, ale są przydzielane bezpośrednio do LOH 
- Kolekcje generacji 2 i LOH mogą zająć zauważalny czas w przypadku programów, które działają przez długi czas lub działają na dużych ilościach danych. 
- Wiadomo, że duże programy serwerowe mają stosy w dziesiątkach GB. 
- GC wykorzystuje różnorodne techniki, aby skrócić czas blokowania wykonywania programu. 
- Podstawowym podejściem jest wykonanie jak największej ilości operacji usuwania elementów bezużytecznych w wątku w tle w sposób, który nie koliduje z wykonywaniem programu. 
- GC ujawnia również programistom kilka sposobów wpływania na jego zachowanie, co może być bardzo przydatne w celu poprawy wydajności.