2011-12-13 12 views
10

Jeśli do obiektu nie odwołuje się żaden inny obiekt, jest on obiektem do pobrania przez moduł zbierający śmieci .NET CLR.W jaki sposób odśmiecanie gromadzi obiekty samoodniesienia?

Jednak jeśli objA referencje objB, objB referencje objC i objC referencje z powrotem do objA, w jaki sposób, że (jako całość) mogą być zbierane postać na śmieciarza?

+2

.NET używa algorytmu [znacznik i przemiatanie (http://stackoverflow.com/questions/2344240/what-is-relacja-between-gc-finalize-and-dispose). –

+0

o tak, poszukaj korzeni, powinienem o tym pomyśleć! – athos

+0

Nie wiem na pewno, ale przypuszczam, że używa jakiegoś rodzaju drzewa, a nic, co nie jest podłączone do głównego drzewa, nigdy nie będzie dostępne z głównego drzewa (przez co mówię kod, który jest obecnie gdzieś w stosie). Nie znam szczegółów, ale teoria wykresów na pewno rozwiąże problem. :) – Chris

Odpowiedz

7

CLR wykorzystuje technikę znaną jako mark-and-sweep.

W ramach tej techniki każdy obiekt może być uważany za wstępnie oznaczony do kolekcji. Następnie CLR przechodzi przez każdy dostępny obiekt, zaczynając od globali (pola statyczne itp.) Jako korzenie, i usuwa znacznik na każdym możliwym do przejścia obiekcie. Następnie zamiata pozostałe zaznaczone obiekty.

Należy pamiętać, że to "oznaczenie" jest pojęciowe; w rzeczywistości obiekty są najprawdopodobniej dodawane do zbioru kolekcji.

W przypadku pętli obiektów, do których się odwołują, w aplikacji nie można znaleźć żadnego odwołania do obiektów, więc algorytm nigdy nie dotrze do tych obiektów, aby je odznaczać.

2

GC ma listę wszystkich utworzonych obiektów. Podczas procesu garbarge zaczyna się od globalnych źródeł (takich jak pola statyczne) i przechodzi przez każdy obiekt, do którego się odwołuje. Każdy obiekt z listy wszystkich, które nie zostały trafione, może zostać zniszczony.

Jeśli nie ma sposobu, aby uderzyć ObjA, objB lub objc, wszystkie te obiekty będą zbierane

+1

Nie, GC nie ma listy wszystkich utworzonych obiektów ... – Guffa

+0

@Guffa: W jaki sposób znajduje obiekty, które wymagają gromadzenia, jeśli nie ma listy wszystkich możliwości? Opisy oznaczeń i zamiatania z pewnością sugerują, że ... – Chris

+0

Chris: GC w rzeczywistości nie "zaznacza" obiektów; to konceptualna konstrukcja. W rzeczywistości jest to obiekt, do którego GC ** może ** uzyskać dostęp, który zostaje zaznaczony negatywnie. Innymi słowy, pomyśl o wyimaginowanej właściwości, która istnieje na wszystkich obiektach, zwanych "znakiem". 'znacznik' jest domyślnie prawdziwy, więc GC musi tylko oznaczyć obiekty ** może ** uzyskać dostęp do fałszywych danych. –