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!
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!
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.
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.
Jest ładny opis w „Pro C# 2008”:
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:
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.
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.
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.
więc kupa będzie wyglądać poniżej obiektu, który przetrwał w Generation 1 promowane na pokolenie 2.
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.
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
Skopiowano zawartość z bloga, aby odpowiedzieć. –
@DeepakMishra dzięki za zredagowanie odpowiedzi. Teraz wygląda świetnie i wysiłek jest naprawdę doceniany. – g00glen00b
Witam, czy możesz mi powiedzieć, kiedy kolekcjoner zbiera przedmioty? Po wykonaniu każdej metody? – Bigeyes
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
@ Duffymo i co samouczek w Javie ma wspólnego z pytaniem o Bigeyes? Z mojego understeandingowego pytania OP wynika, że .net – MaLiN2223