Messaggi di registro Java Garbage Collection


96

Ho configurato Java per eseguire il dump delle informazioni sulla raccolta dei rifiuti nei log ( GC dettagliato ). Non sono sicuro del significato delle voci di garbage collection nei log. Di seguito è riportato un esempio di queste voci. Ho cercato in giro su Google e non ho trovato spiegazioni solide.

Ho alcune ipotesi ragionevoli, ma sto cercando risposte che forniscano definizioni rigorose del significato dei numeri nelle voci, supportate da fonti credibili. Un +1 automatico a tutte le risposte che citano la documentazione del sole. 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 terzina di numeri e la prima?
  3. Perché viene specificato un nome (PSYoungGen) per la prima terzina di numeri ma non per la seconda?
  4. Cosa significa ogni numero (dimensione della memoria) nella terzina. Ad esempio in 109884K-> 14201K (139904K), la memoria è prima di GC 109884k e quindi viene ridotta a 14201K. Come è rilevante il terzo numero? Perché dovremmo richiedere una seconda serie di numeri?

8109.128: [GC [PSYoungGen: 109884K-> 14201K (139904K)] 691015K-> 595332K (1119040K), 0,0454530 secondi]

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]


intero mucchio, giovane generazione parte del mucchio, gc minore per come funziona gc, controlla ad esempio cubrid.org/blog/dev-platform/…
MarianP

Risposte:


90

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

L'opzione della riga di comando -verbose:gcfa sì che le informazioni sull'heap e sulla garbage collection vengano stampate in ciascuna raccolta. Ad esempio, ecco l'output di un'applicazione server di grandi dimensioni:

[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 raccolte minori seguite da una raccolta principale. I numeri prima e dopo la freccia (ad esempio, 325407K->83000Kdalla prima riga) indicano la dimensione combinata degli oggetti attivi prima e dopo la raccolta dei rifiuti, rispettivamente. Dopo raccolte minori, la dimensione include alcuni oggetti che sono spazzatura (non più vivi) ma che non possono essere recuperati. Questi oggetti sono contenuti nella generazione di ruolo o referenziati dalle generazioni di ruolo o permanenti.

Il numero successivo tra parentesi (ad esempio, (776768K)sempre dalla prima riga) è la dimensione impegnata dell'heap: la quantità di spazio utilizzabile per gli oggetti java senza richiedere più memoria al sistema operativo. Nota che questo numero non include uno degli spazi superstiti, 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 della riga (es. 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'output prodotto da -verbose:gcè soggetto a modifiche nelle versioni future.

Non sono sicuro del perché ci sia una PSYoungGen nella tua; hai cambiato il netturbino?


Dove trovare i file di registro gc?
Mr Lou

7
Questa risposta in realtà non risponde alle domande originali. Penso che la risposta di michaeljoseph sia migliore. Affronta le domande poste da Ethan e fa un lavoro migliore scomponendo l'esempio originale. Sebbene ci siano due problemi nella sua risposta (il suo collegamento è ora morto e rafa.ferreria ha sottolineato l'altro), non rigurgita solo un documento Oracle.
Dirk

127
  1. PSYoungGen si riferisce al garbage collector in uso per la raccolta secondaria. PS sta per Parallel Scavenge.
  2. La prima serie di numeri sono le taglie prima / dopo della giovane generazione e la seconda serie è per l'intero mucchio. (La diagnosi di un problema di Garbage Collection descrive in dettaglio il formato)
  3. Il nome indica la generazione e il raccoglitore in questione, il secondo set è per l'intero mucchio.

Un esempio di un GC completo associato mostra anche i raccoglitori utilizzati per le generazioni vecchie e permanenti:

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

Infine, suddividendo una riga dell'output del log di esempio:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107Mb usati prima di GC, 14Mb usati dopo GC, dimensione massima di giovani generazioni 137Mb
  • 675Mb mucchio usato prima GC, 581Mb mucchio usato dopo GC, 1Gb dimensione massima heap
  • GC minore si è verificato 8109,128 secondi dall'inizio della JVM e ha impiegato 0,04 secondi

8
solo un commento minore, il valore tra '()' non è la dimensione massima, per sempre, è la dimensione massima per il momento. Se il GC non riesce a liberare l'heap di meno, allora questo limite richiederà più spazio per il sistema operativo e questo valore aumenterà. Rispettando ovviamente il limite definito su: -Xmx
rafa.ferreira

@ rafa.ferreira Penso che il valore tra parentesi cioè 1119040K sia la dimensione dell'heap impegnata. Non credo, GC stampa la dimensione "max heap" ovunque. Riferimento 1 e riferimento 2
rohitmohta

23

Volevo solo menzionare che è possibile ottenere il registro GC dettagliato con il file

-XX:+PrintGCDetails 

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

-Xloggc:gc.logSembra anche generare lo stesso output come -verbose:gcma puoi specificare un file di output nel primo.

Utilizzo di esempio:

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

Per visualizzare meglio i dati puoi provare gcviewer (una versione più recente può essere trovata su github ).

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


3
Nota che gc.log verrà sovrascritto al riavvio di java (ad esempio, se riavvii il tuo tomcat perché aveva problemi di memoria e ti piacerebbe vedere quel gc.log). O almeno lo farà se ruoti i log del GC. Ci sono molte altre opzioni che controllano la registrazione di gc. Vedi oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html . In particolare, considera-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<some number of files> -XX:GCLogFileSize=<some size> -XX:+PrintTenuringDistribution
Dan Pritts
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.