Mensajes de Registro de Recolección de Basura de Java


He configurado java para volcar información de recolección de basura en los registros ( detallada GC). No estoy seguro de lo que significan las entradas de recolección de basura en los registros. Una muestra de estas entradas se publican a continuación. He buscado en Google y no he encontrado explicaciones sólidas.

Tengo algunas conjeturas razonables, pero estoy buscando respuestas que proporcionen definiciones estrictas de lo que significan los números en las entradas, respaldadas por fuentes creíbles. Un + 1 automático a todas las respuestas que citan la documentación de sun. Mis preguntas son:

  1. ¿A qué se refiere PSYoungGen? Supongo que tiene algo que ver con el anterior (más joven?) generación, pero ¿qué exactamente?
  2. ¿Cuál es la diferencia entre el segundo triplete de números y el primero?
  3. ¿Por qué se especifica un nombre(PSYoungGen) para el primer triplete de números pero no para el segundo?
  4. Qué significa cada número (tamaño de memoria) en el triplete. Por ejemplo, en 109884K->14201K(139904K), es la memoria antes de GC 109884k y luego se reduce a 14201K. ¿Cómo es relevante el tercer número? ¿Por qué necesitaríamos un segundo conjunto de números?

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

8112.111: [GC [PSYoungGen: 126649K - >15528K(142336K)] 707780K - >605892K( 1121472K), 0,0934560 secs]

8112.802: [GC [PSYoungGen: 130344K - >3732K(118592K)] 720708K - >607895K( 1097728K), 0,0682690 secs]

Author: Vadim Kotov, 2009-05-22

3 answers

La mayor parte se explica en la Guía de Sintonización GC (que haría bien en leer de todos modos).

La opción de línea de comandos -verbose:gc hace que la información sobre el montón y la recolección de basura se imprima en cada colección. Por ejemplo, aquí se muestra la salida de una aplicación de servidor grande:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

Aquí vemos dos colecciones menores seguidas por una colección mayor. Los números antes y después de la flecha (por ejemplo, 325407K->83000K de la primera línea) indican el tamaño combinado de objetos vivos antes y después de la recolección de basura, respectivamente. Después de colecciones menores, el tamaño incluye algunos objetos que son basura (ya no están vivos) pero que no se pueden recuperar. Estos objetos están contenidos en la generación titular, o se hace referencia a partir de las generaciones titulares o permanentes.

El siguiente número entre paréntesis (por ejemplo, (776768K) de nuevo desde la primera línea) es el tamaño confirmado del montón: la cantidad de espacio utilizable para objetos java sin solicitar más memoria del sistema operativo. Tenga en cuenta que este número no incluye uno de los espacios sobrevivientes, ya que solo se puede usar uno en un momento dado, y tampoco incluye la generación permanente, que contiene los metadatos utilizados por la máquina virtual.

El último elemento de la línea (por ejemplo, 0.2300771 secs) indica el tiempo necesario para realizar la colección; en este caso, aproximadamente un cuarto de segundo.

El formato para la colección principal en la tercera línea es similar.

El formato de la salida producida por -verbose:gc está sujeto a cambios en futuras versiones.

No estoy seguro de por qué hay un PSYoungGen en el tuyo; ¿cambiaste el recolector de basura?

 87
Author: Michael Myers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-04 04:47:18
  1. PSYoungGen se refiere al recolector de basura en uso para la colección menor. PS significa Carroñero paralelo.
  2. El primer conjunto de números son los tamaños antes/después de la generación joven y el segundo conjunto es para todo el montón. (Diagnosticar un problema de recolección de basura detalla el formato)
  3. El nombre indica la generación y el colector en cuestión, el segundo conjunto son para todo el montón.

Un ejemplo de un GC completo asociado también muestra los colectores utilizados para las generaciones antiguas y permanentes:

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

Finalmente, desglosando una línea de su salida de registro de ejemplo:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107Mb usado antes de GC, 14Mb usado después de GC, tamaño máximo de generación joven 137Mb
  • 675Mb montón usado antes de GC, 581Mb montón usado después de GC, 1Gb tamaño máximo del montón
  • se produjo GC menor8109.128 segundos desde el inicio de la JVM y tomó 0.04 segundos
 120
Author: michaeljoseph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-04 04:53:47

Solo quería mencionar que uno puede obtener el registro GC detallado con el

-XX:+PrintGCDetails 

Parámetro. Luego ves la salida PSYoungGen o PSPermGen como en la respuesta.

También -Xloggc:gc.log parece generar la misma salida como -verbose:gc pero puede especificar un archivo de salida en el primero.

Ejemplo de uso:

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

Para visualizar mejor los datos puede probar gcviewer (una versión más reciente se puede encontrar en github).

Tenga cuidado de escribir el parámetros correctamente, olvidé el " + " y mi JBoss no se iniciaría, sin ningún mensaje de error!

 22
Author: Andrei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-16 09:27:21