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