Registro de recolección de basura en un archivo en Java

1. Información general

La recolección de basura es una maravilla del lenguaje de programación Java que nos proporciona una gestión automática de la memoria. La recolección de basura oculta los detalles de tener que asignar y desasignar memoria manualmente. Si bien este mecanismo es fantástico, a veces no funciona como queremos. En este tutorial, exploraremos las opciones de registro de Java para las estadísticas de recolección de basura y descubriremos cómo redirigir estas estadísticas a un archivo .

2. Indicadores de registro de GC en Java 8 y versiones anteriores

Primero, exploremos los indicadores de JVM relacionados con el registro de GC en versiones de Java anteriores a Java 9.

2.1. -XX: + PrintGC

El indicador -XX: + PrintGC es un alias para -verbose: gc y activa el registro GC básico . En este modo, se imprime una sola línea para cada generación joven y cada colección de generación completa. Dirijamos ahora nuestra atención a proporcionar información detallada de GC.

2.2. -XX: + PrintGCDetails

De manera similar, tenemos el indicador -XX: + PrintGCDetails que se usa para activar el registro detallado de GC en lugar de -XX: + PrintGC .

Tenga en cuenta que la salida de -XX: + PrintGCDetails cambia según el algoritmo de GC en uso.

A continuación, veremos cómo anotar nuestros registros con información de fecha y hora.

2.3. -XX: + PrintGCDateStamps y -XX: + PrintGCTimeStamps

Podemos agregar información de fechas y tiempos a nuestros registros de GC utilizando los indicadores -XX: + PrintGCDateStamps y -XX: + PrintGCTimeStamps , respectivamente.

Primero, -XX: + PrintGCDateStamps agrega la fecha y hora de la entrada del registro al comienzo de cada línea.

Segundo, -XX: PrintGCTimeStamps agrega una marca de tiempo a cada línea del registro detallando el tiempo transcurrido (en segundos) desde que se inició la JVM.

2.4. -Xloggc

Finalmente, llegamos a redirigir el registro de GC a un archivo . Esta bandera toma un nombre de archivo opcional como argumento usando la sintaxis -Xloggc: file y sin la presencia de un nombre de archivo, el registro de GC se escribe en la salida estándar.

Además, este indicador también establece los indicadores -XX: PrintGC y -XX: PrintGCTimestamps para nosotros. Veamos algunos ejemplos:

Si queremos escribir el registro de GC en la salida estándar, podemos ejecutar:

java -cp $CLASSPATH -Xloggc mypackage.MainClass

O para escribir el registro de GC en un archivo, ejecutaríamos:

java -cp $CLASSPATH -Xloggc:/tmp/gc.log mypackage.MainClass

3. Indicadores de registro de GC en Java 9 y versiones posteriores

En Java 9+, -XX: PrintGC , el alias de -verbose: gc , ha quedado obsoleto en favor de la opción de registro unificado, -Xlog . Todos los demás indicadores de GC mencionados anteriormente siguen siendo válidos en Java 9+. Esta nueva opción de registro nos permite especificar qué mensajes deben mostrarse, establecer el nivel de registro y redirigir la salida .

Podemos ejecutar el siguiente comando para ver todas las opciones disponibles para niveles de registro, decoradores de registro y conjuntos de etiquetas:

java -Xlog:logging=debug -version 

Por ejemplo, si quisiéramos registrar todos los mensajes de GC en un archivo, ejecutaríamos:

java -cp $CLASSPATH -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass

Además, este nuevo indicador de registro unificado es repetible, por lo que puede, por ejemplo, registrar todos los mensajes de GC en la salida estándar y en un archivo :

java -cp $CLASSPATH -Xlog:gc*=debug:stdout -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass

4. Conclusión

En este artículo, mostramos cómo registrar el resultado de la recolección de basura en Java 8 y Java 9+, incluido cómo redirigir ese resultado a un archivo.