2015-12-31 17 views
5

Secondo la piattaforma Java , Standard Edition HotSpot Virtual Machine Garbage Collection sintonia sezione Guida intitolata "Generations"gc viene sempre invocato, anche quando lo spazio heap è continuamente disponibile in fase di esecuzione?

Quando le giovani generazioni si riempie, che provoca una collezione minore in cui solo la giovane generazione viene raccolto

e:

alla fine, deve essere raccolto la generazione di ruolo si riempirà e, risultato in una raccolta importante, in cui viene raccolto l'intero heap.

Quindi, se l'applicazione ha terminato la fase di assegnazione, e durante l'esecuzione dell'applicazione, i giovani e di ruolo generazioni non sono mai pieni (a tutti, in qualsiasi fase), poi gc non si verifica nemmeno una volta?

Se accadrà, qual è la ragione? Perché tale sembra contrario alla documentazione collegata.

+1

La gestione della memoria dipende interamente dalla JVM, quindi una JVM * potrebbe * scegliere di eseguire in modo preventivo la garbage collection quando inattiva, se lo desidera. Non so se le attuali implementazioni JVM lo fanno, ma è permesso. Le tue quotazioni provengono da un'implementazione JVM specifica (Oracle HotSpot) e non sono applicabili a tutte le JVM. – Andreas

risposta

6

Quindi, se l'applicazione ha terminato la fase di assegnazione e durante tutta l'esecuzione dell'applicazione, le generazioni giovani e di ruolo non vengono riempite (affatto, in qualsiasi fase), il gc non si verificherà neppure una volta?

Sì. Se le generazioni giovani e di ruolo non sono occupate (in qualsiasi momento), lo gcpotrebbe non verificarsi (anche una sola volta). È compito del runtime JVM gestire la memoria e questo include la decisione su quando (o se) si verifica la garbage collection.

+0

Riesci a pensare ad una ragione per cui JVM deciderà di chiamare gc? c'è un motivo per gestire la memoria in questo scenario? – user3668129

+0

Una possibile ragione, ** potrebbe ** essere una chiamata * esplicita * a ['System.gc()'] (http://docs.oracle.com/javase/8/docs/api/java/lang/System .html # gc--) (che è un'operazione * di advisory *, quindi la JVM * potrebbe * non eseguire * gc *) o se ['Runtime.runFinalizersOnExit()'] (https://docs.oracle.com/ javase/8/docs/api/java/lang/Runtime.html # runFinalizersOnExit-boolean-) è 'true'. Indipendentemente dal fatto che ci sia una ragione, Java non offre agli sviluppatori un meccanismo per eseguire esplicitamente la gestione della memoria. –

+1

@ user3668129 il collector simultaneo tenta di ripulire la memoria contemporaneamente. prima che la memoria sia riempita e quindi può essere attivata in qualsiasi momento. Se lo spazio occupato si riempie, si attiva un "errore di modalità simultanea" e si passa al SerialGC. –

Problemi correlati