2013-05-22 58 views
37

Mi è stata fatta questa domanda e ho appena risposto "perché la JVM ha bisogno di spostare gli oggetti", ma in seguito ho cercato su Google e sembra che non sia stato possibile trovare una risposta ragionevole.Perché la JVM GC completa deve interrompere il mondo?

+3

Date un'occhiata qui dalla pagina di Wikipedia sulla raccolta dei rifiuti http: // it. wikipedia.org/wiki/Garbage_collection_%28computer_science%29#Stop-the-world_vs._incremental_vs._concurrent –

risposta

50

Innanzitutto, Garbage Collection article at wikipedia è davvero una buona lettura.

A proposito di.

In generale, il GC non richiede la pausa Stop the World. Esistono implementazioni JVM che sono (quasi) in pausa (ad esempio Azul Zing JVM). Ogni volta che JVM richiede che STW raccolga dati inutili dipende dall'algoritmo che sta utilizzando.

Mark Sweep Compact (MSC) è un algoritmo comunemente utilizzato in HotSpot per impostazione predefinita. E 'implementato in STW della moda e ha 3 fasi:

  • MARK - Traverse oggetto grafico dal vivo per contrassegnare gli oggetti raggiungibili
  • Sweep - scansioni memoria per trovare la memoria smarcato
  • COMPACT - trasferirsi oggetti contrassegnati per deframmentare memoria libera

Quando si riposizionano oggetti nell'heap, la JVM deve correggere tutti i riferimenti a questo oggetto. Durante il processo di riposizionamento il grafico dell'oggetto è incoerente, per questo motivo è necessaria la pausa STW.

Concorrente Mark Sweep (CMS) è un altro algoritmo in HotSpot JVM che non utilizza la pausa STW per la raccolta spazio vecchio (non esattamente la stessa cosa della raccolta completa).

Il CMS utilizza la barriera di scrittura (trigger che agisce ogni volta che si scrive riferimento in heap Java) per implementare la versione concorrente di MARK e non utilizza COMPACT. La mancanza di compattazione può causare la frammentazione e se la garbage collection in background non è abbastanza veloce, l'applicazione può ancora essere bloccata. In questi casi, CMS riporterà alla raccolta di segni-spazzata-compatta STW.

C'è anche G1 che è una variazione incrementale di MSC. Puoi leggere di più su GC algorithms in HotSpot JVM nel mio blog.

+1

C'è stato un altro algorogramma GC grazie a RedHat http://openjdk.java.net/projects/shenandoah/ – Keynan

0

stop-the-world garantisce che i nuovi oggetti non siano allocati e che gli oggetti non diventino improvvisamente irraggiungibili mentre il collector è in esecuzione.

Il vantaggio è che è più semplice da implementare e più veloce della garbage collection incrementale.

+1

Gli oggetti che diventano irraggiungibili dopo che il GC lo ha contrassegnato come raggiungibile non è un grosso problema. È corretto, e solo * ritarda * il recupero della memoria da parte di un GC cyle. Un problema molto più serio è l'allocazione di nuovi oggetti durante GC e l'unico riferimento che viene memorizzato in oggetti già visitati, quindi l'oggetto verrebbe recuperato erroneamente. Tuttavia, questo non è un problema irrisolvibile. In realtà, è stato risolto dagli anni '70. – delnan

6

Utilizzando la velocità effettiva GC, la JVM necessita di pause STW per essere la memoria il più libera possibile. È solo usando tali pause che è il più efficace.

Utilizzando il collettore a basse pause (CMS), si pulisce la vecchia generazione contemporaneamente, senza interrompere l'applicazione. Lo svantaggio è che la vecchia generazione diventa frammentata. Se è troppo frammentato e ha bisogno di una compattazione, si verifica un GC completo (STW). Tuttavia, puoi sempre ottimizzare la tua applicazione in modo da non ottenere alcun GC completo.

G1 GC è un caso speciale. Il suo attuale obiettivo primario è quello di avere una bassa frammentazione sullo heap, pur rimanendo concomitante (come CMS). Quando non riesce a raggiungere questo obiettivo, la JVM ritorna anche a una pausa STW, in modo che l'heap sia interamente pulito e compattato.

0

Una breve fase di stop-the-world è necessaria per eseguire la ricerca di riferimenti sullo stack in quasi tutti gli schemi di garbage collection, anche nella maggior parte degli schemi che riducono al minimo le pause. Grande spiegazione dettagliata in this answer. Gli algoritmi incrementali e simultanei si impegnano al massimo per ridurre al minimo queste pause al minimo, ma nella maggior parte dei casi sono ancora presenti.

In realtà ci sono anche muovendo/compattare i metodi che non hanno bisogno di fermare il mondo, mentre oggetti in movimento (Staccato vengono in mente)

Problemi correlati