2011-09-02 14 views
5

La JVM solar emite registros de GC detallados a StdOut cuando se utilizan los siguientes args.Registros detallados del GC de Java

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

Sin embargo, no quiero la salida en StdOut y realmente no necesito el detalle para cada GC. ¿Es posible acceder a los datos utilizados para estos registros de forma programática? Me gustaría poder registrar en mi propio archivo de registro la cantidad de memoria asignada/recopilada e idealmente el tamaño promedio del objeto a lo largo del tiempo.

Respuesta

4

es necesario agregar

-Xloggc:log_file_name 

Este archivo se reinicializa cada vez que se inicia la JVM, por lo que no se olvide de moverlo a un lugar seguro si desea mantenerlo para su análisis.

Una lista completa de las muchas opciones de línea de comandos entiende Java se puede encontrar here para Java 6.

+0

Gracias a este. Esperaba que hubiera una API para poder acceder a estos datos en tiempo de ejecución y escribir estadísticas cada 5 minutos sobre el volumen de datos que se asignan, recopilan y promueven. – mchr

+0

Mucha información sobre recolección de basura está disponible a través de JMX, abra 'jconsole' y revise los diferentes mbeans que expone una JVM. Hay varias preguntas aquí en SO con respecto a JMX y GC también. Si entiende alemán, este artículo y el código relacionado contienen algunas ideas interesantes http://www.torsten-horn.de/techdocs/jmx-gc.htm – fvu

+2

A partir de JVM 1.6.0_34, puede hacer que Java gire los registros. '-XX: + UseGCLogFileRotation -XX: NumberOfGCLogFiles = -XX: GCLogFileSize = ' Tenga en cuenta que se requieren las tres opciones. otros consejos aquí: http://jyates.github.io/2012/11/05/rolling-java-gc-logs.html –

0

Puede utilizar los frijoles JMX para grupos de memoria y GC en su lugar. Tienen la ventaja de que obtienes contadores que puedes consultar en un horario libre. La desventaja es que difieren para varios proveedores de máquinas virtuales, versiones y configuraciones de GC.

Por ejemplo

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

¿Los valores CollectionTime de JMX son confiables? Cuando los comparo con los tiempos agregados desde gc.log, me parece que los valores de JMX subestiman drásticamente el tiempo pasado en GC. –

Cuestiones relacionadas