2013-04-16 17 views
24

Ogni processo java che avvio sulla mia macchina sembra avere 2 garbage collector per impostazione predefinita. Lo sto verificando tramite JConsole.Più garbage collector in java

Esempio: per la mia eclissi attualmente in esecuzione.

PS MarkSweep

Collection Count - 221 
Collection Time - 102118 
Memory Pool Names - java.lang.String[4] 

PS scavenging

Collection Count - 241 
Collection Time - 2428 
Memory Pool Names - java.lang.String[2] 

Io parto dal presupposto che hanno piscine che si sovrappongono. Come fanno i due garbage collector a lavorare insieme quando usano le stesse piscine (Eden, survivor, old gen)? Non c'è sovrapposizione nel movimento di oggetti tra i pool (come il movimento da 1 sopravvissuto all'altro quando viene chiamato il secondo algoritmo)? Anche se non lo è, perché abbiamo bisogno di più di un raccoglitore per piscina?

Ho letto this article on GC. Si riferiscono all'uso di collettori diversi per diversi GC maggiori e minori, ma sembra non esserci alcun riferimento all'utilizzo di più collettori nello stesso pool.

+0

Cosa c'è di così strano avere collezionisti diversi per diverse generazioni? – Mikhail

+0

Riesco a capire utilizzando diversi raccoglitori per diverse generazioni, ma sembra che ci siano più collettori per le stesse generazioni. Come funziona? –

+0

Le raccolte principali puliscono tutto l'heap, non solo la vecchia generazione. – Mikhail

risposta

34

Suppongo che abbiano piscine sovrapposte.

Questa ipotesi è errata. PS Scavenge verrà utilizzato per la generazione giovane (eden, survivor) e PS MarkSweep verrà utilizzato per la vecchia generazione. L'unica "sovrapposizione" è che PS Scavenge trasferirà gli oggetti nella vecchia generazione una volta che sono in giro da un po 'e lascerà che PS MarkSweep si occupi di loro allora.

Il vantaggio di avere diversi garbage collector per diversi pool è che un algoritmo che funzioni bene per gli oggetti nel pool di eden non funzionerà necessariamente bene per gli oggetti di vecchia generazione.

This article covers the various options for different garbage collectors working together.

Per quanto riguarda "grandi" collezioni che si verificano quando non c'è spazio per spostare gli oggetti nella vecchia generazione, this (admittedly old) whitepaper from Sun dice il seguente:

... l'algoritmo di raccolta giovani generazioni non è eseguito. Invece, l'algoritmo di raccolta di vecchia generazione viene utilizzato sull'intero heap.

+0

Mi sono imbattuto in questo articolo durante la ricerca, ma ho smesso di leggere in dettaglio come dice il suo per JDK 1.7.0_04, sto usando 1.6. Grazie, lo leggerò e vedrò se risponde alla mia domanda. –

+0

contrassegnandolo come la risposta corretta, ma è possibile chiarire quale collector viene utilizzato nello spazio eden durante una raccolta principale (che esegue una raccolta sull'intero heap)? –

+1

@gap_j - Ho aggiunto qualcosa sulle principali collezioni che ho trovato in un vecchio white paper che spero sia ancora corretto. –

1

formare l'articolo che ci hai fornito:

In genere una frazione degli oggetti sopravvissuti della giovane generazione vengono spostati alla generazione di ruolo durante ogni collezione minore . Alla fine, la generazione di riserva si riempirà e sarà necessario raccogliere , risultante in una raccolta importante, in cui viene raccolto l'intero heap . Le raccolte principali di solito durano molto più a lungo delle raccolte secondarie perché un numero significativamente maggiore di oggetti è implicato in .

+0

Anche la raccolta principale esegue un GC secondario. Non specifica quale raccoglitore viene utilizzato per il GC secondario durante una raccolta importante. –