2013-10-05 16 views
18

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

+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

+0

Powiązany przykład i raport o błędzie jest badany [tutaj] (http://stackoverflow.com/q/35154352/230513). – trashgod

Odpowiedz

6

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.

+1

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

+1

@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. –

+1

@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

10

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.