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.
Nopes ... jej nie. Prawdopodobnie wydaje się, że po prostu tak to ujęłam. W każdym razie –
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