2015-05-21 15 views
5

W pakiecie Android SDK 21 w kodzie Object.java natknąłem się na termin "wskaźnik Brooksa". Przeczytałem post here, ale nie mam jasnego obrazu tego. W poście opisana jest jako odniesienie do samego obiektu w stercie. Ale jaki jest tego pożytek?
Jak to pomoże w zbieraniu śmieci i ewakuacji obiektów?Wskaźnik Brooksa w klasie obiektu

Odpowiedz

3

Blog Romana wyjaśnia, jak działa jego implementacja GC.

Intro

Overview

Brooks Forwarding Pointers

To nowa funkcja w Shenandoah GC, który pozwala wątków aplikacji do interakcji z obiektami w stercie gdy są one przemieszczane wokół podczas zagęszczania (przesuwanie obiektów odniesionych do lepszej lokalizacji), eliminując potrzebę "zatrzymania świata"

Wcześniej trzeba było uniemożliwić dostęp do obiektów z odnośnikami, gdy GC je przenosił, aby nikt nie mógł uzyskać dostępu do obiektu, dopóki nie znajdzie się w jego nowej lokalizacji. Jeśli próbowałeś uzyskać dostęp do obiektu, ale GC już go przesunął, pojawią się problemy. Właśnie dlatego mamy "stop-the-world", gdy nadejdzie czas na GC (żadne nici nie mają dostępu do obiektów w sterty dla środków bezpieczeństwa). Podczas przemieszczania się obiektów wykres obiektów jest uważany za niespójny, dlatego najlepiej uniemożliwić dostęp do niego.

Z tym nowym systemie, forwarding pointer (przewiń do spedycji wskaźnik) należy umieścić w miejscu, obiekt odwołanie kiedyś, który odwołuje się do obiektu nową lokalizację. Teraz nie musimy się martwić, że obiekt nie istnieje, jeśli GC go przenosi, ponieważ wciąż możemy odwoływać się do niego za pomocą wskaźnika przekierowania. Możemy teraz uzyskać dostęp do obiektu, podczas gdy GC przesuwa go wokół, co oznacza, że ​​nie musimy już blokować dostępu podczas kompaktowania.

W „wskaźnik forwarding” mam na myśli to Brooks Pointer

+0

jest wskaźnik spedycja zawsze na bieżąco z nowym adresem obiektu w trakcie poruszania się? – Diffy

+0

@Diffy Podczas przeprowadzania ewakuacji obiekty są przenoszone tylko raz: od "z-regionów" do "do-regionów". Wskaźniki przekazywania są umieszczone w przestrzeni, aby zająć miejsce obiektu przeniesionego do przestrzeni. Nie ma potrzeby ciągłego aktualizowania wskaźnika przekazywania. Wszystko jest wspomniane na jego blogu :) –