2009-05-21 18 views
90

Ho configurato java per eseguire il dump dei dati di raccolta dei rifiuti nei registri (verbose GC). Non sono sicuro di cosa significano le voci della raccolta dei dati inutili nei log. Un esempio di queste voci è pubblicato qui sotto. Ho cercato in giro su Google e non ho trovato spiegazioni solide.Messaggi registro raccolta dati obsoleti

Ho alcune ipotesi ragionevoli, ma sto cercando risposte che forniscano definizioni rigorose di cosa significano i numeri nelle voci, supportate da fonti credibili. Un +1 automatico a tutte le risposte che citano la documentazione solare. Le mie domande sono:

  1. A cosa si riferisce PSYoungGen? Presumo che abbia qualcosa a che fare con la generazione precedente (più giovane?), Ma cosa esattamente?
  2. Qual è la differenza tra la seconda tripletta di numeri e la prima?
  3. Perché un nome (PSYoungGen) è specificato per la prima tripletta di numeri ma non la seconda?
  4. Che cosa significa ogni numero (dimensione della memoria) nella terna. Ad esempio in 109884K-> 14201K (139904K), la memoria prima di GC 109884k è ridotta a 14201K. Come è rilevante il terzo numero? Perché dovremmo richiedere un secondo set di numeri?

8109,128: [GC [PSYoungGen: 109884K-> 14201K (139904K)] 691015K-> 595332K (1119040K), 0.0454530 sec]

8112.111: [GC [PSYoungGen: 126649K-> 15528K (142336K)] 707780K-> 605892K (1121472K), 0.0934560 sec]

8112.802: [GC [PSYoungGen: 130344K-> 3732K (118592K)] 720708K-> 607895K (1097728K), 0.0682690 sec]

+0

intero heap, una nuova generazione dell'heap, minore gc per come funziona gc, controllare ad es. http: //www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ – MarianP

risposta

83

La maggior parte è spiegata nello GC Tuning Guide (che farebbe comunque bene a leggere).

L'opzione della riga di comando -verbose:gc consente di stampare informazioni su heap e garbage collection su ciascuna raccolta. Ad esempio, qui è uscita da una grande applicazione server:

[GC 325407K->83000K(776768K), 0.2300771 secs] 
[GC 325816K->83372K(776768K), 0.2454258 secs] 
[Full GC 267628K->83769K(776768K), 1.8479984 secs] 

Qui vediamo due collezioni minori seguiti da una collezione importante. I numeri prima e dopo la freccia (ad esempio, 325407K->83000K dalla prima riga) indicano rispettivamente la dimensione combinata degli oggetti attivi prima e dopo la raccolta dati inutili. Dopo raccolte secondarie la dimensione include alcuni oggetti che sono spazzatura (non più in vita) ma che non possono essere recuperati. Questi oggetti sono contenuti nella generazione di tenured o referenziati dalle generazioni di ruolo o permanenti.

Il numero successivo tra parentesi (ad esempio, (776768K) di nuovo dalla prima riga) è la dimensione impegnata dell'heap: la quantità di spazio utilizzabile per gli oggetti java senza richiedere più memoria dal sistema operativo. Si noti che questo numero non include uno degli spazi sopravvissuti, poiché solo uno può essere utilizzato in un dato momento e inoltre non include la generazione permanente, che contiene i metadati utilizzati dalla macchina virtuale.

L'ultimo elemento sulla riga (ad esempio, 0.2300771 secs) indica il tempo impiegato per eseguire la raccolta; in questo caso circa un quarto di secondo.

Il formato per la raccolta principale nella terza riga è simile.

Il formato dell'uscita prodotta da -verbose:gc è soggetto a modifiche nelle versioni future.

Non sono sicuro del motivo per cui esiste un PSYoungGen; hai cambiato il garbage collector?

+0

Dove trovare i file di registro gc? – janwen

+5

Questa risposta non risolve veramente le domande originali. Sento che la risposta di michaeljoseph è migliore. Affronta le domande poste da Ethan e fa un lavoro migliore abbattendo l'esempio originale. Mentre ci sono due problemi nella sua risposta (il suo link è morto e rafa.ferreria ha sottolineato l'altro), non rigurgita solo un documento Oracle. – Dirk

116
  1. PSYoungGen si riferisce al raccoglitore di rifiuti in uso per la raccolta minore. PS sta per Parallel Scavenge.
  2. Il primo gruppo di numeri sono le dimensioni prima/dopo della giovane generazione e il secondo gruppo sono per l'intero heap. (Diagnosing a Garbage Collection problem dettagli il formato)
  3. Il nome indica la generazione e il raccoglitore in questione, il secondo set sono per l'intero heap.

Un esempio di GC piena associata mostra anche i collettori utilizzati per i vecchi e permanenti generazioni:

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
      [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
      [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs] 

Infine, abbattendo una riga del vostro esempio output di registro:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs] 
  • 107Mb utilizzato prima di GC, 14Mb utilizzato dopo GC, max. dimensione ung generazione 137Mb
  • 675Mb mucchio usato prima GC, 581Mb mucchio usato dopo GC, 1Gb massima dimensione heap
  • minore GC verificato 8.109,128 secondi dall'inizio della JVM e prese 0.04 secondo
+8

solo un commento minore, il valore tra '()' non è la dimensione massima, per sempre, è la dimensione massima per il momento. Se il GC non è in grado di liberare l'heap meno di questo limite, sarà necessario più spazio per il sistema operativo e questo valore aumenterà. Rispettando ovviamente il limite definito in: -Xmx –

+0

@ rafa.ferreira Penso che il valore in parantesi cioè 1119040K sia la dimensione heap impegnata. Non penso, GC stampa la dimensione del 'max heap' ovunque. [Riferimento 1] (http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html) e [Riferimento 2] (http://docs.oracle.com/javase/7 /docs/api/java/lang/management/MemoryUsage.html) – rohitmohta

22

volevo solo dire che si può ottenere il registro GC dettagliato con la

-XX:+PrintGCDetails 
parametro

. Quindi vedi l'output PSYoungGen o PSPermGen come nella risposta.

Anche -Xloggc:gc.log sembra generare la stessa uscita come -verbose:gc ma è possibile specificare un file di output nel primo.

Esempio di utilizzo:

java -Xloggc:./memory.log -XX:+PrintGCDetails Memory 

di visualizzare i dati di meglio si può provare gcviewer (una versione più recente può essere trovato su github).

Fare attenzione a scrivere i parametri correttamente, ho dimenticato il "+" e il mio JBoss non si avviava, senza alcun messaggio di errore!

+2

GCViewer più aggiornato: https://github.com/chewiebug/GCViewer/wiki – cwash

+2

Si noti che gc.log verrà sovrascritto quando viene riavviato java (come, se si riavvia il tuo tomcat perché stava avendo problemi di memoria, e ti piacerebbe vedere che gc.log). O almeno lo farà se si ruotano i log del GC. Ci sono molte altre opzioni che controllano la registrazione gc. Vedi http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html. In particolare, considera '-XX: + PrintGCDateStamps -XX: + PrintGCTimeStamps -XX: + UseGCLogFileRotation -XX: NumberOfGCLogFiles = -XX: GCLogFileSize = -XX: + PrintTenuringDistribution' –

Problemi correlati