2010-02-13 11 views
32

Nie zrozumiałem pokoleń zbierania śmieci, chociaż znalazłem niektóre z google. Czy ktoś z was może mi to powiedzieć w prostych słowach?Jakie są generacje w zbieraniu śmieci?

Lub może odwoływać się do linku, który będzie łatwy do zrozumienia!

Odpowiedz

37

Od Understanding Garbage Collection in .NET

Pokolenia

pokoleniowa garbage collector zbiera krótkotrwałe obiekty bardziej częściej niż te, które żyły dłużej. Krótkotrwałe obiekty są przechowywane w pierwszym pokoleniu , pokolenie 0. dłużej żyjące obiekty są wsuwane wyższych generacji, 1 lub 2. Kolektor śmieci działa bardziej często w niższych pokoleń niż w wyższe.

Gdy obiekt jest najpierw tworzony jest put do pokolenia 0. Gdy pokolenie 0 jest wypełniona, garbage collector jest wywoływany. Obiekty, które przeżyły zbierania śmieci, w pierwszym pokoleniu są wspierane na następnej wyższej generacji, wytwarzania 1. obiektów, które przeżyły w zbierania śmieci wytwarzania 1, promowany na następny oraz najwyższą generacji wytwarzania 2 Ten algorytm działa wydajnie, aby wyrzucać śmieci z obiektów, ponieważ jest on szybki. Zauważ, że generacja 2 to najwyższa generacja, która jest obsługiwana przez garbage collector.

Garbage Collection in .NET

Pokolenia

Podczas alokacji pamięci na zarządzanej stercie jest szybki, GC sama może zająć trochę czasu. Mając to na uwadze, dokonano kilku optymalizacji , aby poprawić wydajność. GC obsługuje koncepcję generacji, , opierając się na założeniu, że dłuższy obiekt znajdował się na stercie, , tym dłużej będzie on prawdopodobnie znajdować się tam . Gdy obiekt jest przydzielony na , stuła należy do generacji 0. Każda kolekcja śmieci, która przetrwała obiekt , zwiększa swoją generację o 1 (obecnie najwyższa obsługiwana generacja to 2). Oczywiście to szybciej przeszukiwać i śmieci zbierać podzbiór wszystkich obiektów na stercie, więc GC ma możliwość zbierania jedynie generacji 0, 1 lub 2 obiekty (lub cokolwiek kombinacja wybiera aż ma wystarczająca pamięć). Nawet gdy zbiera tylko młodsze obiekty, GC może również określić, czy stare obiekty mają odwołania do nowych obiektów o , aby nie przypadkowo zignorować obiekty będące w użyciu.

17

Jest ładny opis w „Pro C# 2008”:

  1. Generation 0 identyfikuje nowo utworzony obiekt, który nigdy nie został zaznaczony do kolekcji
  2. Generation 1 identyfikuje obiekt, który przeżył GC (oznaczony do zbierania, ale nie usunięty, ponieważ było wystarczająco dużo miejsca na sterty)
  3. Generacja 2 identyfikuje obiekt, który przeżył więcej niż jedno przemiatanie GC.
+0

Witam, czy możesz mi powiedzieć, kiedy kolekcjoner zbiera przedmioty? Po wykonaniu każdej metody? – Bigeyes

+0

Nie należy zadawać pytań jako komentarza w 7-letnim pytaniu. Każdy tutorial w języku Java powie Ci, że GC działa w oddzielnym wątku w wybranym przez siebie momencie. – duffymo

+0

@ Duffymo i co samouczek w Javie ma wspólnego z pytaniem o Bigeyes? Z mojego understeandingowego pytania OP wynika, że ​​.net – MaLiN2223

5

Mój pierwszy blog odpowiedzi na swoje pytanie: Generations of Garbage Allocation

Dodanie informacji o link:

Garbage collector CLR za (GC) jest pokoleniowej garbage collector, znany również jako śmieciarza ephermal.

Ma trzy pokolenia:

Generacja 0: Zawiera wszystkie nowo zbudowany obiekt, który nigdy nie są analizowane przez GC.

Generacja 1: CLR, po inicjalizacji, wybiera wielkość budżetu w kb dla generacji 0. Jeśli tworzenie obiektu powoduje, że generacja 0 przekracza swój budżet, rozpoczyna się odliczanie śmieci. Obiekty, które nie są zbierane w Generacji 0, są przenoszone do Generacji 1, a Generacja 0 jest opróżniana. Powiedzmy, że budżet Generacji 0 jest równy wielkości 5 obiektów. Tak więc generowanie 0 wyglądają jak niżej przed utworzenia obiektu 6:

enter image description here

Po utworzeniu obiektu 6, przydział śmieci zapadnie które zwolni obiektów na śmieci 1, 3 i 5, i przemieszcza się 2 i 4, jeden obok inny wytwórczych 1.

enter image description here

wysokości budżetu wytwarzania 1 jest również zaznaczona CLR po inicjalizacji. Utworzenie obiektu 11 powoduje GC, aby rozpocząć kolejny, który może poruszać się trochę więcej przedmiotów na pokolenie 1.

enter image description here

Generation 1 jest ignorowany dla zbierania śmieci, aż osiągnie swój rozmiar budżetowego do zbierania śmieci, która poprawia wydajność GC.

Generation 2:

ciągu kilku generacji 0 kolekcji generacja 1 może przewyższyć To limitu budżetu, które powodują GC do zbierania śmieci z obu pokoleń. W tym przypadku osoby, które przeżyły pokolenie 1, awansują do pokolenia 2, osoby, które przeżyły pokolenie 0, awansują do pokolenia 1, a pokolenie 0 jest puste.

Powiedzmy, że obiekt przydziału 21 powoduje, że osiągnięto poziom zbierania i generowania śmieci 1. enter image description here

więc kupa będzie wyglądać poniżej obiektu, który przetrwał w Generation 1 promowane na pokolenie 2.

enter image description here

Więc w zasadzie generacji GC zakłada, że ​​nowe obiekty mają większe prawdopodobieństwo zebrane.

Wiemy, że CLR wybiera budżety dla wszystkich trzech generacji, ale może je modyfikować, ponieważ GC to samostrojenie kolektora. Jeśli GC zauważy, że istnieje niewiele obiektów, które przetrwały po zebraniu generacji 0, może zdecydować o zmniejszeniu budżetu generowania 0, więc mniej pracy zostanie wykonane. Z drugiej strony, jeśli GC gromadzi generację 0 i widzi, że istnieje wiele zachowanych obiektów, nie odzyskano dużej ilości pamięci podczas zbierania śmieci. W takim przypadku narzędzie do zbierania śmieci zwiększy budżet 0. GC modyfikuje również odpowiednio budżety generacji 1 i 2.

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/17323312) – 1ac0

+1

Skopiowano zawartość z bloga, aby odpowiedzieć. –

+1

@DeepakMishra dzięki za zredagowanie odpowiedzi. Teraz wygląda świetnie i wysiłek jest naprawdę doceniany. – g00glen00b