2013-10-05 14 views
18

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

+1

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

+0

Un esempio correlato e una segnalazione di bug sono esaminati [qui] (http://stackoverflow.com/q/35154352/230513). – trashgod

risposta

6

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.

+1

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

+1

@Cowboy Correggi, ma copyMemory può essere di qualsiasi lunghezza, quindi più a lungo si copia, più a lungo si raggiunge un safepoint. –

+1

@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

10

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.