2014-10-07 4 views
8

Ho una domanda sulle radici GC. Ho letto che su GC roots è "Live thread". Cosa significa? Ho sempre avuto l'impressione che ogni thread abbia il proprio stack e le variabili locali di uno stack sono le radici GC per thread e ora sono confuso. Quali altri tipi di riferimenti agli oggetti, che non sono sullo stack dei frame o sullo stack nativo, hanno la rappresentazione dei thread?Thread come root GC

Un'altra domanda è che la raccolta di giovani generazioni utilizza le radici di GC, oppure è solo per i principali algoritmi?

Grazie

Aggiornamento: Ok scusa, in modo da mantenere le cose semplici: ho letto questo breve articolo: yourkit.com/docs/java/help/gc_roots.jsp e c'è un opzione "filo" come GC root, cosa significa esattamente che thread è una radice GC? Che tipo di oggetti sono referenziati da Thread GC root, a cui non fa riferimento il suo stack? Perché queste due categorie sono diverse?

+1

La tua domanda è confusa. 1) Naturalmente solo i thread live contano per le radici GC. 2) Cos'è una "rappresentazione del thread"? 3) Le variabili statiche sono radici GC non stack. 4) Ogni variante GC prende in considerazione le radici di GC; è impossibile * non * tenerne conto. –

+0

Ok scusa, per semplificare: ho letto questo breve articolo: http://www.yourkit.com/docs/java/help/gc_roots.jsp e c'è l'opzione "Thread" come root GC, che cosa esattamente significa che thread è una radice di GC? Che tipo di oggetti sono referenziati da Thread GC root, a cui non fa riferimento il suo stack? Perché queste due categorie sono diverse? – alobodzk

+0

@MarkoTopolnik Non penso che le variabili statiche siano root, altrimenti i loaders delle classi non scaricheranno mai. –

risposta

3

Ho letto che una delle radici GC è "Live thread". Cosa significa?

Un thread live è un thread che è stato avviato e non è ancora terminato.

Quali altri tipi di riferimenti a oggetti, che non sono su stack di frame o stack nativi, hanno la rappresentazione di thread?

Nessuno.

Quando si dice che un thread (live) è una radice GC, significa (in effetti) tutti i valori dei frame stack del thread.

(Il "stack frame" e il "stack nativo" sono la stessa cosa.)

... cosa significa esattamente quel filo è una radice GC?

Significa che lo stack di thread è una radice GC e il contenuto di tutte le variabili live in tutti i frame dello stack del thread è raggiungibile.

Queste cose dicono tutte in modo efficace la stessa cosa.

+0

Grazie per il chiarimento! – alobodzk

+0

Dubito che la categorizzazione di yourkit sia arbitraria. Significano sicuramente * qualcosa * con quelle distinzioni. –

+0

Lo stack frame viene utilizzato per il codice interpretato e lo stack nativo viene utilizzato dall'interprete stesso e dal codice compilato da JIT. –

0

Immaginate un metodo con un oggetto java thread locale new'ed, quando il metodo termina l'oggetto è scomparso (il riferimento esce dall'ambito e qualsiasi memoria allocata nell'heap eleggibile per GC). Se nello stesso metodo si avvia il thread, ora il tempo di live di quell'oggetto thread e qualsiasi riferimento a esso è anche legato alla durata del thread \ live. Fino a quando il thread non esce alcuna memoria ancora referenziata dal thread in esecuzione non è idoneo per GC e il thread si dice sia una radice GC.

I thread possono allocare memoria in due modi diversi tramite lo stack o l'heap. La memorizzazione dello stack non è GC ma viene recuperata quando il frame dello stack corrente viene svolto. Generalmente, l'archiviazione heap viene allocata quando si utilizza "nuovo" nel codice (nota nuova non significa sempre archiviazione heap consultare Escape Analysis). L'heap è GC'ed.

Un buon modo per saperne di più sulle radici di GC è quello di fare un dump della tua applicazione java in esecuzione e caricarlo in Visual VM o Eclipse MAT, da lì dovresti essere in grado di esaminare le radici del GC.

La raccolta di giovani generazioni userebbe le radici di GC in quegli oggetti con radici di GC non idonee per GC ma sarebbe meglio parlare in termini di un determinato algoritmo.

0

La JVM partiziona i suoi thread, alcuni sono utilizzati esclusivamente per Garbage Collection, alcuni sono per altre attività JVM interne e alcuni eseguono la parte fornita dall'utente dell'eseguibile.

In questo contesto, raggiungibile è raggiungibile dai thread di esecuzione dell'utente. Questo include il primo thread che è destinato ad essere eseguito da public static void main(String[] args) e tutti i thread lanciati da quel thread, meno quelli che diventano irraggiungibili o completi.