2011-08-19 16 views
9

Przeczytałem, że przypinanie obiektów w zarządzanej sterty wpływa na wydajność GC w .NET, ponieważ GC nie może kompaktować pamięci, jeśli są przypięte obiekty "na drodze". Ale ponieważ stertę dużych obiektów nie zagęszcza się tak, nie powinno to dotyczyć obiektów w LOH. Czy są jakieś inne ukryte koszty przypięcia obiektu, który znajduje się w LOH? Czy mogę bezpiecznie przypinać obiekty w LOH bez pogarszania wydajności GC?Czy przypięcie obiektu w LOH wpływa na wydajność GC?

Odpowiedz

5

Cóż, tylko dlatego, że sterty dużych obiektów (LOH) nie są zbite, nie oznacza to, że nie są one gromadzone . The LOH is collected i przypinanie obiektu będzie miało wpływ na przyszłe przydziały.

Ponieważ obiekt jest przypięty, efektywnie zmniejsza ilość pamięci dostępnej w LOH (tak samo, jak w przypadku odniesienia). Gdy zostanie utworzone inne żądanie przydzielenia dużego obiektu, jeśli w LOH jest zbyt wiele odniesień przypiętych/wstrzymanych, można uruchomić problemy z przydzielaniem większej liczby dużych obiektów.

Po zaznaczeniu znacznika w części zbierania i usuwania znaczników CLR prawdopodobnie oznacza wszystkie odniesienia przypięte jako pierwiastki, więc prawdopodobnie nie ma wpływu podczas tej części kolekcji; Zachowałoby się to w ten sam sposób, gdyby ktoś zachowywał odniesienie do dużego obiektu.

Ponieważ deallokacja odbywa się w ten sam sposób na LOH (blok jest po prostu oznaczony jako dostępny), ta operacja również nie ma wpływu.

I wreszcie, ponieważ LOH nie jest skompaktowany, ta operacja nigdy nie ma miejsca na tej stercie podczas GC, więc nie ma to wpływu na to.

Podsumowując, alokacje na LOH mogą być oznaczone jako zdecydowanie za pomocą przypinania odnośników do obiektów na LOH, podczas gdy najprawdopodobniej nie są to zbiory na LOH.

Chociaż nie zapominajmy, że alokowanie i przechowywanie dużych bloków pamięci może mieć konsekwencje ogólnie dla systemów, komentarze te są ściśle dotyczące LOH.

+0

Dzięki za odpowiedź. Nie jestem pewien, czy otrzymam drugi akapit: dlaczego przypinanie zmniejsza ilość dostępnej pamięci bardziej niż zachowanie odniesienia? Zawsze jednak przypisywanie czegoś do LOH zasadniczo oznaczało szukanie wolnego bloku pamięci lub przydzielenie nowego segmentu - jeśli tak, każdy blok live powinien być traktowany tak samo, przypięty lub nie. – Niki

+0

@nikie: To już nie działa, ma tylko taki sam efekt (jak już powiedziałeś). Odpowiednio zaktualizowałem swoją odpowiedź. To drobna, ale znacząca zmiana. – casperOne

Powiązane problemy