Quando un garbage collector congela i thread dell'applicazione prima di pulire oggetti non referenziati, tutti i thread devono essere in un "safepoint" nella loro esecuzione. Ho trovato una ricchezza di scritti che descrivono il concetto di safepoint, ma pochissimi esempi. Dove verrà posizionato un punto di sicurezza all'interno di un tipico metodo Java e perché? E, ancora più importante, dove non può verificarsi un safepoint?Java GC safepoint
risposta
Purtroppo si tratta di un campo definito non valido. La JVM pone i punti di sicurezza quando decide di farlo, ma non ci sono specifiche su quando. Una versione/aggiornamento alla successiva di Java può essere diversa. Ci sono alcuni casi come Unsafe.copyMemory() che non ha un safepoint, ma non puoi essere sicuro di dove saranno posizionati i punti di sicurezza.
Uhm, ma quella è una chiamata nativa e io sempre che una chiamata nativa è un safepoint ... cioè è sicuro inserire nativo e rimanere lì, ma non tornare nel codice Java (nel caso in cui un GC sia in corso). – Cowboy
@Cowboy Correggi, ma copyMemory può essere di qualsiasi lunghezza, quindi più a lungo si copia, più a lungo si raggiunge un safepoint. –
@PeterLawrey Unsafe può avere una lunghezza illimitata; ecco perché Bits copia solo fino a 1 MB alla volta; questo è per consentire o safepoints AFAIK – bond
L'esatta definizione e implementazione di unamodifiche da un'implementazione VM a un'altra, ma considerando Hotspot VM, è possibile trovare una buona definizione in: Safepoints in HotSpot JVM.
HotSpot glossary dice:
Un punto durante l'esecuzione del programma in cui tutte le radici GC sono noti e tutti i contenuti oggetto mucchio sono coerenti. Da un punto di vista globale, tutti i thread devono bloccare in un safepoint prima che il GC possa essere eseguito.
Tipicamente, il safepoint è implementata da JVM iniettando un controllo safepoint in un metodo, la maggior parte dei siti di chiamata qualificano come safepoints - quando si raggiunge il controllo safepoint, la filettatura si controlla se è richiesto il safepoint (es FullGC è prevista) , se sì, allora il thread si blocca. Quando tutti i thread nel blocco VM, hai raggiunto il safepoint in cui tutti gli oggetti nella VM sono perfettamente raggiungibili. Quindi, viene eseguita l'operazione VM che ha richiesto il safepoint (ad esempio un FullGC), dopo che i thread sono stati ripristinati.
Controllare l'elenco delle operazioni di VM che richiedono un safepoint: Safety First: Safepoints.
È possibile studiare il comportamento di safepoint in Hotspot utilizzando -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1
.
- 1. Analisi log GC Java
- 2. Java GC Concetto: CMSInitiatingOccupancyFraction
- 3. Registri GC Java dettagliati
- 4. Significato messaggio "operazioni fusero durante safepoint"
- 5. Java GC: perché due regioni sopravvissute?
- 6. Java verbose: gc Come leggere l'output?
- 7. Calcolo della% di tempo GC server Java
- 8. Android GC - LogCat mostrando sempre l'attività GC
- 9. Thread come root GC
- 10. permgen, ma Java VisualVM dice "Nessuna radice GC trovata"
- 11. Limite di sovraccarico del GC Java superato - Soluzione personalizzata necessaria
- 12. Java CMS essere ignorato e ottenere completa GC Invece
- 13. Come trovare le radici GC delle classi anonime in java?
- 14. Orologio da parete GC completo Java molto lento
- 15. Dare più tempo CPU a GC in java?
- 16. Il log GC Java è pieno di caratteri strani
- 17. Registrazione delle informazioni GC nell'applicazione
- 18. GC uscita chiarimento
- 19. Come posso testare l'unità GC?
- 20. AppDomains e GC Heap
- 21. Do ValueTypes causa GC?
- 22. Attendere GC concorrente bloccato
- 23. Soppressione dell'output di gc()
- 24. GC in Java 8 diventa ovviamente più lento rispetto a Java 7
- 25. Come ascoltare eventi GC in Android
- 26. Ottimizza l'utilizzo del GC Haskell
- 27. GC non sta finalizzando UserControl?
- 28. GHC per thread Strategia GC
- 29. Cosa sono i fori GC?
- 30. Tecniche che causano un costante GC Churn
Ancora, chiamate native a parte, non riesco a trovare un esempio di cosa sia un safepoint e cosa no. Forse è mal definito, ma comunque frustrante. – Cowboy
Un esempio correlato e una segnalazione di bug sono esaminati [qui] (http://stackoverflow.com/q/35154352/230513). – trashgod