2009-07-08 14 views
25

Rozumiem i doceniam użyteczność klasy w środowisku .NET, ale jestem ciekawa szczegółów implementacji.Implementacja WeakReference w .NET

W jaki sposób implementuje się WeakReference w .NET? MSDN omawia szczegółowo użycie WeakReference, ale ma niewiele szczegółów, które widziałem na temat tego, jak działa to pod maską.

W jaki sposób CLR śledzi odniesienie i potrafi wyeliminować wewnętrzny uchwyt podczas zbierania celu, bez uniemożliwiania GC? Czy to wymaga szczególnej obsługi w samym CLR?

Moim głównym zmartwieniem byłoby, czy istnieją konsekwencje związane z wydajnością używania WeakReferences (szczególnie w przypadku korzystania z wielu z nich), które różnią się od tych przy użyciu standardowych odwołań do obiektów.

+5

Od tego czasu wykonałem sporo badań i opublikowałem na blogu moje szczegółowe informacje: http://reedcopsey.com/?p=50 –

Odpowiedz

19

Klasa WeakReference odrzuca odwołanie do obiektu do GC i odzyskuje uchwyt. Kiedy otrzymasz referencję lub sprawdzisz, czy referencja jest żywa, uchwyt służy do zapytania GC o referencję.

Oznacza to, że GC przechowuje listę wszystkich słabych odniesień, które musi zaktualizować po zebraniu obiektów. Oznacza to także, że za każdym razem, gdy używasz słabego odniesienia, jest pewien narzut.

Tak więc każde słabe odniesienie oznacza trochę więcej pracy dla odśmiecacza, ale z drugiej strony robi to również każde regularne odniesienie, nawet jeśli jest mniejsze. Powinieneś być oczywiście ostrożny przy używaniu wielu słabych referencji, ale jeśli potrzebujesz tego, aby zarządzanie pamięcią działało dobrze z twoimi obiektami, to powinno to przeważać małe obciążenie, które powoduje.

+1

Ustanowię to jako odpowiedź, ponieważ jest to dobry, podstawowy opis procesu. Dzięki, Guffa. –

13

Wspomniał Pan o MSDN; Czy widziałeś już ten artykuł?

http://msdn.microsoft.com/en-us/magazine/bb985011.aspx

Sprawdź również rozdział 19 w "Applied Microsoft .NET Framework Programowanie" tego samego autora (Jeffrey Richter). Ten rozdział dotyczy zbierania śmieci i zawiera sekcję o wewnętrznych atrybutach WeakReference.

Ogólnie, jeśli uzyskujesz dostęp do dużej liczby Targets w ramach WeakReferences, występuje trafienie wydajnościowe tylko dlatego, że WeakRef wykonuje pewne działania (głównie w zakresie bezpieczeństwa wątków) przed zwróceniem celu. Nie jest to oczywiście tak tanie, jak bezpośrednie odwoływanie się do obiektu. Z drugiej strony, uzyskujesz pewną wydajność podczas przechowywania odniesień do dużych obiektów, ponieważ garbage collector ma więcej opcji, gdy pojawiają się problemy z pamięcią.

Nigdy nie próbowałem oszacować tego handlu, ani nie znam żadnych odniesień tutaj. Oczywiście różni się nieco w zależności od aplikacji.

+2

+1, a także dzięki za materiał referencyjny. Tylko FYI, zrobiłem więcej badań i jest zaskakująco mało narzutów związanych z bezpieczeństwem wątków w WeakReference - w większości chodzi o to, że trzeba GCHandle oddać obiekt, który działa jak podwójne odwoływanie się do systemu, a także kilka kontroli zerowych. –

+0

Wydaje mi się, że pamiętałem, że widziałem to kilka lat temu, ale naprawdę powinienem to potwierdzić, zanim odłożyłem odpowiedź. Dziękuję za uwagę, Reed. – ars

+0

+1 dla podręcznego materiału referencyjnego. –