Gdy odśmiecacz zamraża wątki aplikacji przed czyszczeniem obiektów bez odnośników, wszystkie wątki muszą być w "bezpiecznym punkcie" podczas ich wykonywania. Znalazłem bogactwo pisma opisujące koncepcję bezpiecznego miejsca, ale bardzo niewiele przykładów. Gdzie znajdzie się punkt przywilejowy w typowej metodzie Java i dlaczego? A co ważniejsze, gdzie nie można zachować bezpiecznego miejsca?Java GC safepoint
Odpowiedz
Niestety jest to słabo zdefiniowane pole. JVM umieszcza punkty bezpieczeństwa, gdy zdecyduje się, ale nie ma specyfikacji, kiedy. Jedna wersja/aktualizacja następnej Javy może być inna. Istnieje kilka przypadków, takich jak Unsafe.copyMemory(), która nie ma punktu przywracania, ale nie można mieć pewności, gdzie zostaną umieszczone punkty bezpieczeństwa.
Uhm, ale to jest połączenie natywne i zawsze mówię, że natywne połączenie jest bezpiecznym punktem ... tzn. Bezpieczne jest wchodzenie do rodzimego i pozostanie tam, ale nie wracać do kodu Java (w przypadku, gdy GC jest w toku). – Cowboy
@Cowboy Prawidłowo, ale copyMemory może mieć dowolną długość, więc im dłużej będziesz kopiować, tym dłużej, zanim dotrzesz do bezpiecznego punktu. –
@PeterLawrey Unsafe może mieć nieograniczoną długość; to dlatego Bity kopiują tylko do 1 MB na raz; jest to dozwolone lub bezpieczne AFAIK – bond
Dokładna definicja i implementacja safepoint
zmienia się z jednej implementacji VM na inną, ale biorąc pod uwagę Hotspot VM, można znaleźć ładną definicję w: Safepoints in HotSpot JVM.
HotSpot glossary mówi:
punkt w czasie wykonywania programu, w którym wszystkie pierwiastki GC są znane, a wszystkie dane są zgodne obiektów sterty. Z globalnego punktu widzenia wszystkie wątki muszą blokować w bezpiecznym punkcie, zanim GC będzie mógł działać.
Zazwyczaj safepoint jest realizowany przez JVM wtryskiwania kontrolę safepoint do metody, większość stron połączenia zakwalifikować jako safepoints - po osiągnięciu kontrolę safepoint gwint sprawdza, czy wymagane jest safepoint (np FullGC zaplanowano) , jeśli tak, to wątek blokuje. Kiedy wszystkie wątki w bloku VM osiągniesz punkt przywracania, gdzie wszystkie obiekty w VM są doskonale osiągalne. Następnie wykonywana jest operacja VM, która zażądała punktu bezpiecznego (np. FullGC), po czym wątki są wznawiane.
Sprawdź listę operacji VM wymagających punktu przywracania: Safety First: Safepoints.
Możesz badać zachowanie safepoint w Hotspot przy użyciu -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1
.
Na razie, poza nawiasami, nie znajduję przykładu tego, co jest bezpieczne, a co nie. Być może jest źle zdefiniowany, ale i tak frustrujący. – Cowboy
Powiązany przykład i raport o błędzie jest badany [tutaj] (http://stackoverflow.com/q/35154352/230513). – trashgod