2013-05-16 12 views
6

Umożliwia powiedzieć, że przedmioty mają 2 - przedmiot A i B. odnośników Object OBIEKTU odniesienia B i przedmiot B obiektu A.śmieci zbiór okrągły obiekt odwołanie

  1. jeżeli obie Object & obiektu B są z refowanie kodu - jak Garbage collector wie, że można go zebrać.
  2. W jaki sposób Garbage Collector może wydedukować, że jakikolwiek obiekt jest poza zakresem/gotowy do usuwania śmieci?
  3. Co jeśli obiekt A nie jest refowany przez nasz kod, ale nadal może być niezależny. Na przykład. jeśli jest klasą Form, wówczas może działać samodzielnie, nawet jeśli Obiekt A zostanie ponownie zainicjowany na nową instancję lub podana wartość null.
+1

Powinieneś przeczytać: http://msdn.microsoft.com/en-us/library/ee787088.aspx Odpowiada na twoje pytania i więcej. (Z grubsza: GC ma listę rzeczy, które wie, są żywe (odwołania statyczne, zmienne stosu itp.), Które są "korzeniami" .Dowolny inny obiekt, do którego można dotrzeć poprzez odwołanie do odwołań zaczynających się od tych korzeni, również jest uważany za żywy. obiekt, który * nie może * jest uważany za kwalifikujący się do gromadzenia.) – dlev

+0

Edytowałem twój tytuł. Zobacz, "[Czy w tytułach pytania powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/)", gdzie konsensus brzmi "nie, nie powinien". –

+1

Jeśli interesuje Cię ten rodzaj rzeczy, absolutną najlepszą książką (IMO) jest [CLR Via C#] (http://www.amazon.co.uk/CLR-Via-Edition-Developer-Reference/dp/0735667454/ref = dp_ob_title_bk) (który znajduje się w czwartym wydaniu i zawiera nowo zaktualizowaną sekcję o narzędziu do zbierania śmieci). Nie mogę tego wystarczająco polecić. Naprawdę świetnie sprawdza się to, co dzieje się w CLR. –

Odpowiedz

6
  1. GC nie odebrać obiekt i sprawdź, czy cokolwiek to odniesienia; zachowując to, jeśli tak. GC ma kolekcję każdego obiektu, który według niej jest "żywy". Ta kolekcja rozpoczyna się jako wszystkie zmienne statyczne, wszystkie zmienne na stosie i kilka innych specjalnych przypadków. Następnie przechodzi przez każdy z tych "żywych" obiektów i widzi, do jakich obiektów się odwołują. Każdy przywoływany obiekt jest oznaczony jako "żywy", ponieważ oznacza, że ​​jest on w jakiś sposób osiągalny przez inny żywy obiekt. Powtarza ten proces, dopóki nie zostaną odkryte żadne nowe obiekty. Wszystko, co nie zostało oznaczone jako żywe, jest znane jako nieosiągalne. Jak możesz stwierdzić, ponieważ nigdy nie sprawdzałeś, co dany "martwy" obiekt odwołuje, to, czy istnieje odniesienie kołowe, nie ma znaczenia.

  2. Patrz # 1.

  3. Cóż, w większości przypadków jest to rzeczywiście odniesienie; w przypadku formularza, na przykład, masz Application.OpenForms odwołanie do wszelkich otwartych formularzy. Podobne konstrukty często istnieją dla takich obiektów. W rzadkich przypadkach z takimi obiektami, jak liczniki czasu, GC wyraźnie je przekazuje, aby nie zostały zebrane. Takie sytuacje są rzadkie i zazwyczaj nie musisz się nimi martwić.

0
  1. Kolektor śmieci przegląda aktywnych odnośników, a wszystko, co nie znajduje się stamtąd mogą być gromadzone. W ten sposób nie ma znaczenia, że ​​te dwa obiekty odwołują się do siebie, ponieważ oba odniesienia są nieaktywne.

  2. Patrz 1.

  3. Forma jest składnikiem, więc jest utrzymywane przy życiu przez zarejestrowania jako jeden. Po uruchomieniu sama aplikacja utrzymuje go przy życiu, dopóki formularz nie zostanie usunięty. Posiadanie zmiennej, która odwołuje się do formularza, a następnie ustawienie zmiennej na wartość null zmienia tylko odniesienie, nie robi nic dla samego obiektu.