Aktualizacja referencji nie jest jedyną rzeczą, która wymaga pauzy. Wszystkie standardowe algorytmy zgrupowane w obszarze „przeciągnij znacznik” zakładają, że cały wykres obiektu pozostaje niezmieniony podczas zaznaczania. Prawidłowa obsługa modyfikacji (tworzone nowe obiekty, zmieniane odniesienia) wymaga dość trudnych alternatywnych algorytmów, takich jak algorytm trójkolorowy. Terminem parasolowym jest „równoczesne zbieranie śmieci”.
Ale tak, aktualizacja referencji po zagęszczeniu również wymaga przerwy. I tak, użycie pośrednictwa (np. Poprzez trwały identyfikator obiektu i tablicę skrótów do rzeczywistych wskaźników) może znacznie zmniejszyć pauzę. Możliwe jest nawet, aby uczynić tę część bez blokady, jeśli ktoś sobie tego życzy. Nadal byłoby tak samo trudne, jak każda współbieżność pamięci współdzielonej niskiego poziomu, ale nie ma fundamentalnego powodu, aby to nie działało.
Jednak , by to mieć poważne wady. Oprócz zajmowania dodatkowej przestrzeni ( co najmniej dwa dodatkowe słowa dla wszystkich obiektów), każda dereferencja jest znacznie droższa. Nawet coś tak prostego, jak uzyskanie atrybutu, obejmuje teraz pełne wyszukiwanie tabeli skrótów. Oceniłbym, że osiągnięty wynik jest znacznie gorszy niż w przypadku przyrostowego śledzenia.
Twoje podejście nie rozwiązuje od razu problemu zbierania śmieci, ale przesuwa go tylko o jeden poziom wyżej. I za jaką cenę! Teraz każdy dostęp do pamięci podlega kolejnej dereferencji wskaźnika. Nie możemy buforować lokalizacji wyniku, ponieważ mogła ona zostać w międzyczasie przeniesiona, zawsze musimy przejść przez identyfikator obiektu. W większości systemów ta pośrednia nie jest akceptowalna i zakłada się, że zatrzymanie świata ma niższy całkowity koszt czasu wykonywania.
Powiedziałem, że twoja propozycja tylko porusza problem, a nie rozwiązuje go. Problem dotyczy ponownego użycia identyfikatorów obiektów. Identyfikatory obiektów są teraz naszym odpowiednikiem wskaźników i istnieje tylko skończona liczba adresów. Można sobie wyobrazić (szczególnie w systemie 32-bitowym), że w czasie życia twojego programu powstanie więcej niż obiektów INT_MAX, np. W pętli
Jeśli tylko zwiększymy identyfikator obiektu dla każdego obiektu, w pewnym momencie skończą nam się identyfikatory. Dlatego musimy dowiedzieć się, które identyfikatory są nadal w użyciu, a które są bezpłatne, aby można je było odzyskać. Brzmi znajomo? Wróciliśmy teraz do punktu wyjścia.
źródło
W twoim myśleniu nie ma błędu, właśnie opisałeś coś bardzo zbliżonego do tego, jak działał oryginalny moduł śmieciowy Java
Tak więc działa, zostało wypróbowane, a jego nieefektywność doprowadziła do opracowania systemów znakowania i zamiatania pokoleń.
źródło
Object.getHashCode()