2011-09-02 18 views
5

La Sun JVM emette i registri GC dettagliati su StdOut quando vengono utilizzati i seguenti argomenti.Registri GC Java dettagliati

-verbose:gc 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDetails 

Tuttavia, non voglio l'output in stdout e ho davvero bisogno di dettaglio per ogni singolo GC. È possibile accedere ai dati utilizzati per questi registri in modo programmatico? Mi piacerebbe essere in grado di accedere al mio file di registro la quantità di memoria allocata/raccolta e idealmente la dimensione media dell'oggetto nel tempo.

risposta

4

è necessario aggiungere

-Xloggc:log_file_name 

questo file viene reinizializzata ogni volta che si avvia la JVM, quindi non dimenticate di spostarla in luogo sicuro, se si desidera mantenere per l'analisi.

Un elenco completo delle molte opzioni della riga di comando Java capisce può essere trovato here per Java 6.

+0

Grazie per questo. Speravo che ci sarebbe stata un'API in modo da poter accedere a questi dati in fase di esecuzione e scrivere statistiche ogni 5 minuti sul volume di dati che sono stati assegnati, raccolti e promossi. – mchr

+0

Un sacco di informazioni riguardanti la garbage collection sono rese disponibili tramite JMX, aprire 'jconsole' e controllare i diversi bean che espone una JVM. Ci sono diverse domande qui su SO per quanto riguarda JMX e GC pure. Se capisci in tedesco questo articolo e il relativo codice contengono alcune idee interessanti http://www.torsten-horn.de/techdocs/jmx-gc.htm – fvu

+2

A partire da JVM 1.6.0_34 puoi fare in modo che java ruoti i log. '-XX: + UseGCLogFileRotation -XX: NumberOfGCLogFiles = XX: GCLogFileSize = ' Nota che tutte e tre le opzioni sono necessari. altri suggerimenti qui: http://jyates.github.io/2012/11/05/rolling-java-gc-logs.html –

0

È possibile utilizzare i fagioli JMX per piscine di memoria e GC, invece. Hanno il vantaggio di ottenere dei contatori che puoi richiedere su un programma gratuito. Lo svantaggio è che differiscono per vari produttori di VM, versioni e impostazioni GC.

Per esempio

java.lang:type=GarbageCollector,name=Copy 
    CollectionCount, ColletionTime, LastGCInfo[1].duration,memoryUSageBefore/After 
java.lang:type=GarbageCollector,name=MarkSweepCompact 
    CollectionCount, CollectionTime, LastGCInfo[1].duration,memoryUSageBefore/After 
java.lang:type=Memory 
    HeapMemoryUsage[1].commited,init,max,used 
+0

I valori CollectionTime di JMX sono affidabili? Quando li paragono ai tempi aggiunti dal gc.log e trovo che i valori di JMX drasticamente sottostimano il tempo trascorso in GC. –

Problemi correlati