2010-02-03 13 views
7

Mam teorię, że mechanizm zbierania śmieci CLR oznacza, że ​​mogę uciec z odwołaniami cyklicznymi w hierarchii obiektów bez tworzenia zakleszczeń do usuwania i usuwania śmieci. Czy to bezpieczne założenie? (Język docelowy VB.NET)Czy metoda zbierania śmieci CLR oznacza, że ​​można bezpiecznie rzucać odwołania do obiektów kołowych?

+0

Zobacz tutaj podobne pytanie z bardzo dobrej odpowiedzi przyjętą http://stackoverflow.com/questions/400706/circular-references -cause-memory-leak –

+0

@David: AZ powiedział, że _nie używa liczenia odwołań. –

+0

@Johannes: To był błąd w moim komentarzu, miałem na myśli pytanie (a nie odpowiedź), początkowe pytanie brzmiało, czy użycie referencyjnego liczenia w CLR sprawiło, że cykle były niebezpieczne. Pytanie (nie odpowiedź AZ) było błędne w kwestii tego, w jaki sposób CLR wykonuje GC. –

Odpowiedz

11

Śmieciarka .NET to generacyjny znak i moduł zbierający. Nie korzysta z liczenia odwołań. Więc tak, bezpiecznie mieć referencje kołowe. Język nie ma znaczenia

+1

Po prostu bądź bardzo ostrożny, aby uniknąć przekazywania odniesienia do statycznego, a także pamiętaj, że delegaci będą traktowali jako odniesienie do obiektu, w którym są zaimplementowani. bardzo łatwe do utrzymania rzeczy przy życiu, takie jak statyczna lista zdarzeń zdarzenia. – morechilli

3

Zgodnie z tym artykułem: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5109829.html

Circular odniesienia to problem, który pojawia się, gdy nie są dwa obiekty, które odnoszą się do każdej nawzajem. Załóżmy, że masz klasę A, która odnosi się do klasy B. Jeśli klasa B również odnosi się do klasy A, to mamy odniesienie kołowe w postaci . Zdarza się to w wielu sytuacjach. Typowym przykładem dla jest stosunek między rodzicem a dzieckiem, w którym dziecko współdziała z obiektem macierzystym, a również zawiera odniesienie do obiektu nadrzędnego . Może to prowadzić do tego, że obiekty nie zostaną oczyszczone, dopóki aplikacja nie zostanie zamknięta. Sposób wywoływania śmieci w trybie .NET rozwiązuje problem z okrągłym numerem referencyjnym , ponieważ moduł czyszczenia pamięci może wyczyścić dowolny obiekt, który jest dostępny z poziomu katalogu głównego.

EDIT:
Sądząc z tego postu: http://blogs.msdn.com/abhinaba/archive/2009/01/27/back-to-basics-reference-counting-garbage-collection.aspx wydaje się, że zbieranie śmieci .NET nie opiera się na liczeniu odniesienia do zbierania śmieci.

Kolejny artykuł warto przeczytać (garbage collection wyjaśnia szczegółowo) jest to jedno: http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

+2

"NIE można uzyskać z poziomu root'a" –

Powiązane problemy