2009-04-21 11 views
21

W terminologii laureata, w jaki sposób działa mechanizm usuwania śmieci?Jak działa mechanizm usuwania śmieci?

Jak obiekt jest zidentyfikowany jako dostępny do usuwania śmieci?

Co ponadto oznacza Reference Counting, Mark and Sweep, Copying, Train w algorytmach GC?

+4

Nopes ... jej nie. Prawdopodobnie wydaje się, że po prostu tak to ujęłam. W każdym razie –

+1

Polecam lekturę dość dobrego, 34-stronicowego papieru ilustrowanego, [* Uniprocessor Garbage Collection Techniques *, Paul R. Wilson (1992)] (http://www.cse.nd.edu/~dthain /courses/cse40243/spring2006/gc-survey.pdf), który wyjaśnia pojęcia leżące u podstaw podstawowych technik usuwania śmieci (liczenie odwołań, znacznik i znacznik, znacznik kompaktowy, przyrostowy, pokoleniowy). – stakx

Odpowiedz

29

Podczas korzystania z języka z funkcją czyszczenia pamięci użytkownik nie uzyskuje bezpośredniego dostępu do pamięci. Raczej dostaniesz dostęp do jakiejś abstrakcji na górze tych danych. Jedną z rzeczy, która została właściwie usunięta, jest faktyczna lokalizacja w pamięci bloku danych, a także wskaźniki do innych baz danych. Kiedy uruchomi się moduł do zbierania śmieci (zdarza się to sporadycznie), sprawdza, czy nadal posiadasz odnośnik do każdego z bloków pamięci, który dla ciebie przydzielił. Jeśli tego nie zrobisz, zwolni to pamięć.

Główną różnicą między różnymi rodzajami śmieciarek jest ich wydajność, a także wszelkie ograniczenia dotyczące schematów alokacji, z którymi mogą sobie poradzić.

Najprostszy jest właściwy licznik odwołań. Kiedy kiedykolwiek tworzysz odniesienie do obiektu, wewnętrzny licznik na tym obiekcie jest zwiększany, gdy masz szansę odniesienia lub nie jest już w zasięgu, licznik na (byłym) obiekcie docelowym jest zmniejszany. Gdy licznik osiągnie zero, obiekt nie jest już w ogóle przywoływany i może zostać zwolniony.

Problem związany z odliczaniem odrzucających śmieci polega na tym, że nie mogą zajmować się danymi kołowymi. Jeśli obiekt A ma odniesienie do obiektu B, a ten z kolei ma pewne (bezpośrednie lub pośrednie) odniesienie do obiektu A, to nigdy nie zostaną one uwolnione, nawet jeśli żaden z obiektów w łańcuchu nie zostanie skazany poza łańcuchem (a zatem nie są one dostępne). w ogóle dostęp do programu).

Algorytm oznaczania i zamiatania z drugiej strony może obsłużyć to. Algorytm znakowania i przeciągania działa poprzez okresowe zatrzymywanie wykonywania programu, oznaczyć każdą pozycję, którą program przydzielił jako nieosiągalny. Następnie program przechodzi przez wszystkie zmienne programu i zaznacza, co wskazują na osiągalne. Jeśli jedna z tych alokacji zawiera odniesienia do innych danych w programie, dane te są również oznaczane jako osiągalne, itp.

To jest część znacznika algorytmu. W tym momencie program może uzyskać dostęp, niezależnie od tego, jak pośrednio, jest oznaczony jako dostępny, a wszystko, czego program nie może osiągnąć, jest oznaczone jako niedostępne. Śmieciarz może teraz bezpiecznie odzyskać pamięć związaną z obiektami oznaczonymi jako nieosiągalne.

Problem z algorytmem znakowania i usuwania jest taki, że nie jest tak skuteczny - cały program musi zostać zatrzymany, aby go uruchomić, a wiele odniesień do obiektów nie ulegnie zmianie.

Aby to poprawić, algorytm znacznika i przemiatania można wydłużyć, korzystając z tzw. "Generowania garbage collection". W tym trybie przedmioty, które były w systemie dla pewnej liczby śmieci, są promowane do starego pokolenia, które nie jest sprawdzane tak często.

Poprawia to efektywność, ponieważ obiekty mają tendencję do obumierania (myśl o zmianie sznurka w pętli, co może trwać nawet kilkaset cykli) lub żyją bardzo długo (obiekty używane do reprezentowania głównego okna aplikacja lub połączenie z bazą danych serwletu).

Znacznie bardziej szczegółowe informacje można znaleźć na stronie wikipedia.

dodane na podstawie opinii:

ze znakiem i zamiatać algorytmu (a także wszelkie inne algorytm zbierania śmieci oprócz liczenia odniesienia) zbieranie śmieci zrobić nie bieg w ramach swojego programu, ponieważ musi mieć dostęp do rzeczy, do których twój program nie ma bezpośredniego dostępu. Dlatego nie można powiedzieć, że śmieciarz działa na stosie.

+3

Jasne, łatwe i krótkie. Jedno z pytań tutaj, które powiedziałeś o znaczniku i przemiataniu, które sprawdza wszystkie zmienne w twoim programie. Jeśli nie mam racji, odniesienia istnieją na stosie i obiekcie w stercie, to jak możemy powiązać, że proces GC działa w Heap. –

3

Zbieranie śmieci to po prostu informacja, czy w przyszłości istnieje potrzeba zmiennych, a jeśli nie, należy je zebrać i usunąć.

Nacisk jest na słowie śmieci, coś, co jest całkowicie wykorzystywane w domu jest wyrzucane do śmieci i człowiek śmieci obsługuje to dla ciebie za przyjście, aby go podnieść i zabrać ją, aby dać Ci więcej miejsca w koszu na śmieci.

Liczenie Reference, Mark i Sweep, kopiowanie, zręczność itp omawiane są w dobrej szczegółowości w liczeniu GC FAQ

4
  • Reference - Każdy obiekt ma licznik, który jest zwiększany, gdy ktoś bierze odniesienie do obiekt i zmniejsza się, gdy ktoś zwalnia odniesienie. Kiedy licznik odniesie się do zera, obiekt zostaje usunięty. W tym podejściu COM wykorzystuje .
  • Oznacz i przeciągnij - Każdy obiekt ma flagę, jeśli jest w użyciu. Zaczynając od katalogu głównego wykresu obiektu (zmienne globalne, locale na stosach itp.) Każdy obiekt, do którego się odwołuje, ustawia swoją flagę, itd. W dół łańcucha. Na końcu usuwane są wszystkie obiekty, które nie są przywoływane na wykresie.

Śmieciarka do CLR jest opisana w tym slidedeck. "Korzenie" na slajdzie 15 są źródłami obiektów, które najpierw wchodzą na wykres. Pola ich członków i tak dalej służą do znajdowania innych obiektów na wykresie.

Wikipedia opisuje kilka z tych podejść w dużo bardziej i bardziej szczegółowo.

+0

Przeszedłem przez wikipedię ... w rzeczywistości przeszkadza mi to, że jest to Object Graph, w jaki sposób jest utrzymywany i przechodzi przez procedurę GC. –

+0

Zaktualizowałem swoją odpowiedź, korzystając z widoku 10k do budowania wykresu obiektu. – Michael

0

Ogólny sposób jest to, że liczba odniesień do obiektu są śledzone w tle, a gdy liczba ta idzie do zera, obiekt jest SUBJECT TO garbage collection, jednak GC nie uruchomi się dopóki nie jest to wyraźnie potrzebne, ponieważ jest to droga operacja. Po uruchomieniu GC przechodzi przez zarządzany obszar pamięci i znajduje każdy obiekt, który nie ma referencji. Gc usuwa te obiekty, najpierw wywołując ich destruktory, pozwalając im na posprzątanie po sobie, a następnie zwalnia pamięć. Powszechnie GC następnie kompaktuje obszar pamięci zarządzanej, przenosząc każdy zachowany obiekt do jednego obszaru pamięci, umożliwiając więcej przydziałów.

Tak jak powiedziałem, jest to jedna z metod, które znam i jest wiele badań prowadzonych w tej dziedzinie.

0

Garbage collection to duży temat i istnieje wiele sposobów na jego wdrożenie.

Ale najczęściej używane w skrócie, odśmiecacz prowadzi rejestr wszystkich odniesień do wszystkiego, co stworzono za pomocą operatora new, nawet jeśli użycie tego operatora było ukryte przed użytkownikiem (na przykład w metodzie Type.Create()). Za każdym razem, gdy dodajesz nowe odniesienie do obiektu, korzeń tego odniesienia jest określany i dodawany do listy, jeśli to konieczne. Odniesienie jest usuwane, gdy tylko wykracza poza zakres.

Gdy nie ma już żadnych odniesień do obiektu, może on (nie "będzie") zostać zebrany. Aby poprawić wydajność i upewnić się, że niezbędne czyszczenie odbywa się prawidłowo, kolekcje są grupowane dla kilku obiektów jednocześnie i odbywają się przez wiele pokoleń.

Powiązane problemy