2013-06-05 10 views
6

Które algorytmy zbierania śmieci mogą rozpoznać obiekty śmieci tak szybko, jak stają się śmieciami?Jakie są "precyzyjne" algorytmy zbierania śmieci?

Jedyne, co przychodzi mi do głowy to liczenie odwołań z dodanym cyklem wyszukiwania za każdym razem, gdy licznik odwołań jest zmniejszany do niezerowej wartości.

Czy istnieją inne interesujące algorytmy gromadzenia danych, które mogą to osiągnąć? (Zauważ, że pytam tylko z ciekawości, zdaję sobie sprawę, że wszystkie takie kolektory byłyby prawdopodobnie nieefektywne).

+0

W dniu dzisiejszym w Hacker News pojawiła się wiadomość o GC w czasie rzeczywistym. (Nie przeczytałem tego) – leppie

+0

Po każdej zmianie referencji można uruchomić znakowanie i zamiatanie GC. Choć byłoby to niezwykle nieefektywne. – svick

+0

@ Sick: Masz rację. Teraz czuję się głupio :) – Askaga

Odpowiedz

-4

Taki mechanizm nazywany byłby "zarządzanie stosem", a nie wyrzucaniem śmieci.

Zgodnie z definicją, usuwanie śmieci jest oddzielone od zarządzania stosem. Dzieje się tak dlatego, że w niektórych środowiskach/aplikacjach skuteczniejsze jest pominięcie wykonywania "darmowej" operacji i śledzenie tego, co jest w użyciu. Zamiast tego, co jakiś czas, właśnie temu w pobliżu i zebrać wszystkie węzły bez odniesienia i umieścić je z powrotem na wolnej liście.

== Uzupełnienie ==

mam czym downvoted za próbę skorygowania terminologii zarządzania sterty ze zbierania śmieci. The Wikipedia article zgadza się z moim użyciem i tym, czego nauczyłem się na uniwersytecie, mimo że było to kilka dekad temu. Języki takie jak Lisp i Snobol wymyślili potrzebę zbierania śmieci. Języki takie jak C nie zapewniają tak wysokowydajnego środowiska uruchomieniowego; Zamiast tego należy polegać na programatorze, który zarządza oczyszczaniem nieużywanych bitów pamięci i zasobów.

+1

To brzmi jak komentarz terminologiczny do mnie, a nie właściwie odpowiedź na to pytanie. – svick

+0

Też nie sądzę, że masz rację. Liczenie odwołań * to * forma zbierania śmieci. – svick

+0

@wallyk: Wspomniałeś artykuł wikipedia (dlaczego nie połączyć go?). Na wikipedii przyjrzałem się "sterowaniu stosem", które przekierowuje do "zarządzania pamięcią", które dotyczy głównie szczegółów poziomu i technik przydzielania, co nie jest ściśle związane z moim pytaniem. Ponadto, ponieważ svick został już skomentowany, Twój post tak naprawdę nie odpowiedział na moje pytanie. Zasadniczo twoja odpowiedź wyjaśnia, dlaczego kolekcjonerzy z prawdziwego życia nie działają w sprawie zaproponowanej w moim op, o czym już wiem, o czym mówiłem w moim pytaniu. Możesz edytować odpowiedź, aby odpowiedzieć na pytanie, a ja ją przegłosuję. – Askaga

0

Chociaż nie jest to algorytm zbierania śmieci, analiza ucieczki pozwala wnioskować o czasie życia obiektów. Tak więc, jeśli wydajność jest problemem i przedmioty powinny być gromadzone nie we wszystkich, ale w "oczywistych" przypadkach, może być przydatne. Podstawową ideą jest wykonanie analizy statycznej programu (w czasie kompilacji lub w czasie ładowania w przypadku kompilacji dla maszyny wirtualnej) i wykrycie, czy nowo utworzony obiekt może uciec przed rutynową operacją (stąd nazwa analizy) . Jeśli obiekt nie zostanie przekazany nigdzie indziej, nie będzie przechowywany w pamięci globalnej, nie zostanie zwrócony z podanej procedury itp., Może zostać zwolniony przed powrotem z tej procedury lub nawet wcześniej, w miejscu jej ostatniego użycia.

Obiekty, które nie żyją dłużej niż powiązane wywołanie metody, mogą być przydzielane na stosie, a nie w stercie, aby można je było usunąć z cyklu zbierania śmieci podczas kompilacji, zmniejszając w ten sposób nacisk na ogólny GC.

Powiązane problemy