Analizando registros de gc

Estoy usando las -XX:+PrintGCApplicationStoppedTime y -XX:+PrintGCApplicationConcurrentTime para activar el registro de gc.

¡Pero descubrí que solo después de 4 0 5 impresiones de PrintGCApplicationStoppedTime mis detalles reales de los registros de gc se imprimen a través del -XX:+PrintGCDetails !

Por definición, PrintGCApplicationStoppedTime imprime la PrintGCApplicationStoppedTime aplicación detenida para cada gc.

Pero no tengo claro por qué se imprime como en el ejemplo que se muestra a continuación.

Es eso porque

PrintGCApplicationStoppedTime solo se imprime después de cada punto de scope seguro

(o)

el archivo de registro será registrado por diferentes subprocesos de gc. Estoy usando barrido concurrente para GC completo y ParNew para la generación joven

Mi aplicación es una aplicación web.

Patrón de O / P: me pongo así:

 Application time: 0.3847031 seconds Total time for which application threads were stopped: 0.3135419 seconds Application time: 0.1520723 seconds Total time for which application threads were stopped: 0.1993920 seconds Application time: 0.1188219 seconds Total time for which application threads were stopped: 0.1993920 seconds Application time: 0.1188219 seconds Total time for which application threads were stopped: 0.1993920 seconds Application time: 0.1188219 seconds Total time for which application threads were stopped: 0.1993920 seconds Application time: 0.1188219 seconds 1.229: [GC 1.229: [ParNew: 256000K->51200K(256000K), 0.1509756 secs] 426536K->334728K(997376K), 0.1510198 secs] [Times: user=0.85 sys=0.07, real=0.15 secs] 

Desafortunadamente PrintGCApplicationStoppedTime es un nombre engañoso para esta opción de JVM.

De hecho, imprime el tiempo pasado dentro de los puntos de seguridad. Las pausas de Safepoint ocurren no solo debido a la recolección de basura, sino por muchas otras razones:

  • Desoptimización
  • Rechazo de locking sesgado
  • Volcado de subprocesos
  • Inspección de montones
  • Redifinición de clase
  • etc. (ver la lista)

Los puntos de seguridad pueden ocurrir periódicamente incluso sin una operación VM solicitada para desinflar los monitores inactivos, realizar ciertas tareas de limpieza JIT, etc. Ver -XX:GuaranteedSafepointInterval opción de máquina virtual de -XX:GuaranteedSafepointInterval (1000 milisegundos por defecto).

Use -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 para volcar más información sobre safepoints.