To wydaje się proste pytanie, ale po wielu lekturach na ten temat wciąż nie znalazłem ostatecznej odpowiedzi (być może dlatego, że jest tak proste).
Moje pytanie brzmi: kiedy śmieciarz zagęszcza obiekty na stercie, w jaki sposób aktualizowane są odniesienia do tych obiektów na stosie? Mogę wymyślić dwa możliwe rozwiązania:
- Przejdź przez stos (i odniesienia w stercie) i zaktualizuj odniesienie, aby wskazywało nową lokalizację obiektu. Analogicznie do przeprowadzki byłoby to jak wysłanie listu do każdego, kto ma twój adres i poproszenie go o zaktualizowanie książki adresowej o nowy adres.
- Podaj tabelę wyszukiwania. To tak, jakby zostawić adres do przekazania w lokalnym urzędzie pocztowym.
Czy śmieciarze używają głównie jednej z tych dwóch metod? Jakaś inna metoda? Obie?
garbage-collection
todorojo
źródło
źródło
Odpowiedzi:
Nie mam specjalistycznej wiedzy na ten temat, ale rozumiem, że pierwsza metoda jest ogólnie stosowana.
Garbage collector i tak musi przeanalizować stos, aby dowiedzieć się, jakie rzeczy na stosie są określane ze stosu. Gdy zdecyduje się coś przenieść, musi skorygować odniesienia do niego, i nie ma powodu, aby rozróżniać stertę i stos w tym momencie.
Podejście oparte na tabeli przeglądowej może zasadniczo działać. Jednak to spowodowałoby, że wszystkie dostępy do wskaźnika muszą wykonać 2 kroki. Miałoby to ogromny wpływ na wydajność w normalnych czasach pracy. Szczególnie w przypadku użycia wielu małych obiektów. (Jest to przypadek, w którym najnowocześniejsze programy GC zwykle wyprzedzają liczenie referencji).
źródło