test online collector collection java logging garbage-collection

online - Rolling basurero recoge registros en java



garbage collector viewer (5)

¿Es posible hacer un balanceo de los registros del recolector de basura en Sun JVM?

Actualmente genero registros usando:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log

Pero tengo que rotarlos manualmente usando fifo queues y rotatelogs para crear un nuevo registro para cada día. Espero que haya una mejor solución para esto.

¿Tal vez hay una forma de acceder a estas entradas de registro desde el interior de Java para poder redirigirlas a log4j?

Editar: la solución con fifo queue no es lo suficientemente buena porque si el proceso que lee de esta cola (por ejemplo, rotatelogs) lee que se ralentiza, se ralentizará todo el jvm (aparentemente Sun / Oracle hace el registro de gc sincrónicamente)


¿Has probado estas nuevas opciones?

Intenté jdk7u7, jdk7u6 y jdk6u35 así:

java -Xloggc:gc.log -XX:+PrintGCDetails -XX:+UseGCLogRotation -XX:NumberOfGClogFiles=3 -XX:GCLogFileSize=10M

pero con cada versión veo este error:

Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.

Se hace referencia a Bugfix # 6941923 para 7u2 aquí: http://www.oracle.com/technetwork/java/javase/2col/7u2bugfixes-1394661.html


El soporte integrado para la rotación del registro de GC se ha agregado a HotSpot JVM. Se describe en la RFE 6941923 y está disponible en:

Hay tres nuevos indicadores de JVM que pueden usarse para habilitarlo y configurarlo:

  • -XX:+UseGCLogFileRotation
    se debe usar con -Xloggc:<filename> ;
  • -XX:NumberOfGCLogFiles=<number of files>
    debe ser> = 1, el valor predeterminado es uno;
  • -XX:GCLogFileSize=<number>M (or K)
    el valor predeterminado se establecerá en 512K.

Si no puede actualizar su versión java para usar los nuevos indicadores para rotar el registro de gc, entonces podría especificar un archivo gc diferente cada vez que se inicie la aplicación:

JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxPermSize=256m -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/path/to/log/dir/gc.log-"`date +%Y-%m-%d-%H-%M`

Cuando se hace referencia al setenv, generalmente al inicio o al apagar, hará referencia a un archivo de registro diferente. En Unix esto se puede utilizar como un método para ''rotar'' el registro.


Terminé resolviendo este problema al generar un nuevo hilo en mi aplicación y enviar periódicamente el comando jcmd log- jcmd (basado en una expresión cron).

Este es un enfoque poco convencional, ya que utilizará la API Attach de Oracle, aunque el enfoque sirvió para nuestro caso de uso de rotación de registros de GC cada hora.


Un enfoque interesante sería redirigir gc.log a una tubería con nombre -Xloggc:/my/named/pipe Cómo escribir el registro de la GC en una tubería con nombre

luego lea ese conducto de la aplicación en sí: ¿Cómo abrir un conducto Windows llamado desde Java?

y log a un registrador logback arbitrario (por ejemplo, asincrónico) del código.

Intenté eso en una máquina con Windows. Desafortunadamente, es más complicado configurar Windows que Linux.

En Windows funciona básicamente con la ayuda de un script adicional de Powershell (también puede ser una aplicación dedicada). Este proyecto de ejemplo también contiene una aplicación de demostración que se puede utilizar de inmediato para probar la redirección de registros de GC a Logback a través de SLF4J.