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?
risposta
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.
C'è stato un altro algorogramma GC grazie a RedHat http://openjdk.java.net/projects/shenandoah/ – Keynan
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.
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
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.
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)
- 1. Restrizione della JVM per non invocare GC
- 2. Java CMS essere ignorato e ottenere completa GC Invece
- 3. Perché gli oggetti immutabili sono amati dal GC di JVM?
- 4. JVM si blocca dopo il gc completo sporadicamente
- 5. Se la JVM continua a spostare gli oggetti quando fa GC, come risolve i riferimenti?
- 6. Ottimizzazione JVM (GC) per applicazione server ad alta risposta
- 7. Java GC: perché due regioni sopravvissute?
- 8. analizzare i log GC per Sun Hotspot, JVM 6
- 9. Usa JVM GC args -XX: SurvivorRatio = 8 non funziona
- 10. Tempo di misurazione trascorso su GC in JVM
- 11. Perché Leiningen mantiene attiva la propria JVM?
- 12. OutOfMemoryError - come uccidere la JVM dopo la creazione dell'hprof
- 13. Perché il mondo .net non ha server di applicazioni come il mondo Java?
- 14. C'è un modo per sapere quale algoritmo GC sta correntemente usando la JVM
- 15. C#, perché il GC viene eseguito più volte al secondo?
- 16. Perché il GC simultaneo causa talvolta ExecutionEngineException (per MSDN)?
- 17. Perché bianco/grigio/nero in GC?
- 18. Perché il contenuto del lavoro la politica di sicurezza in tutto il mondo, ma Safari
- 19. perché il delegato deve essere statico?
- 20. Registri GC Java dettagliati
- 21. Vuoto loop infinito e GC (JVM). Si prega di spiegare l'effetto
- 22. La JVM scambia l'heap?
- 23. Perché la JVM consuma meno memoria di -Xms specificata?
- 24. Perché la JVM ha gli iconst_2 - iconst_5 opcode?
- 25. Analisi log GC Java
- 26. Impossibile interrompere la stampa
- 27. Perché HttpWebRequest.BeginGetResponse() completa in modo sincrono?
- 28. API java scripting - come interrompere la valutazione
- 29. Perché la JVM consente di impostare il valore "alto" per IntegerCache, ma non il "basso"?
- 30. Solr (JVM) di picco ogni ora
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 –