.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.