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
.
- 1. Java verbose: gc Jak odczytać wyjście?
- 2. Strojenie Java GC dla ciągów znaków
- 3. Clojure zamknięcia i GC
- 4. Rejestrowanie informacji GC w aplikacji
- 5. Sposób wyzwalania ręcznego Java GC z konsoli linux bez X11
- 6. Dlaczego Java G1 gc spędza tyle czasu na skanowanie RS?
- 7. CMS Java jest ignorowany i uzyskuje pełne GC Zamiast tego
- 8. Java GC: najlepsze klasy obiektów promowane (według rozmiaru)?
- 9. Jak zoptymalizować gc Java dla długich obiektów życia
- 10. Techniki powodujące konsekwentne GC Churn
- 11. Jakiekolwiek wady wydajności GC?
- 12. JVM minuta długa GC
- 13. Czy ValueTypes powoduje GC?
- 14. Zablokuj wyjście gc()
- 15. GC nie finalizuje UserControl?
- 16. Uruchamianie blokowania GC ObjectsAllocated
- 17. Próba przekierowania wyjścia "git gc"
- 18. Jak zrozumieć pełny dziennik GC?
- 19. Wyjaśnienie sprawozdania dziennika Tomcat GC
- 20. gc większej liczby scala actor
- 21. Przekroczony limit GC podczas pracy sonaru
- 22. Błąd fragmentacji pamięci Android GC. Obejście?
- 23. częste duże gc ale nie wolne sterty?
- 24. Linux używający systemu/procesora jądra z uruchomioną Javą GC
- 25. Pusta nieskończona pętla i GC (JVM). Proszę wyjaśnić efekt
- 26. Perl Wyrażenie regularne - co oznacza modyfikator gc?
- 27. Częste GC zapobiegania iskry z pracujących równolegle
- 28. Ograniczanie JVM, aby nie wywoływać GC
- 29. Czy zmiana rozmiaru tablic wywołuje GC?
- 30. Luca GC i gra w czasie rzeczywistym
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