WIP (JVM troubleshooting)

Oracle monitoring tools

jps

Lista los procesos Java en ejecución

Hay más! Estos son los más usados...

jstack

Permite obtener el stack de todos los threads creados por un proceso Java

jmap

Permite obtener información sobre el mapeo a memoria de un proceso Java

jstat

Permite obtener información sobre el uso de recursos y la perfomance de un proceso Java

Java Mission Control

Suite con interface gráfica para hacer profiling y obtener info relevante de performance

Java VisualVM

Similar a Java Mission Control

JPS

-l mostrar paquete de la clase main

o del jar con el que se inicio

-v mostrar parámetros que

se pasaron a la JVM

Listar los procesos Java en ejecución

Útil para encontrar fácilmente el pid de un proceso Java

No lista los procesos Java de otro usuario (para eso usar ps)

Los parámetros listados por -v pueden estar truncados.

> cat /proc/[pid]/cmdline

Para verlo completo:

Jstack

> jstack [pid]

Permite obtener el stack de todos los threads creados por un proceso Java

Útil para ver lo que están haciendo los threads en ese instante

Jmap

> jmap [pid]

Permite obtener información sobre el mapeo a memoria de un proceso Java

Muestra las lib compartidas que usa el proceso (shared objects)

> jmap -dump:[live,] [pid]

Dump del heap de la JVM en formato hprof

[live] fuerza una corrida de la c para que el dump solo contenga los objetos vivos

> jmap -histo[:live] [pid]

Imprime un histograma de la heap

> jmap -clstats [pid]

Estadística sobre los class loaders

> jmap -finalizerinfo [pid]

Info sobre objetos que están esperan la ejecución de su finalize()

Muestra por cada clase:

  • Cantidad de objetos
  • Tamaño en memoria (bytes)
  • Paquete completo de la clase
> jmap -heap [pid]

Resumen sobre la GC, configuración y estadísticas del uso de la memoria

jmap -histo

Imprime un histograma de la heap

[live] fuerza una corrida de la c para que el dump solo contenga los objetos vivos

> jmap -histo[:live] [pid]

Jstat

> jstat -gcutil [pid]

Permite obtener información sobre la performance y el uso de recursos de un proceso Java

Resumen de estadísticas de la gc y la memoria.

> jstat -gccause [pid]

gcutil + causa que desencadenó las 2 últimos eventos de gc.

> jstat -gcmetacapacity [pid]

Estadísticas sobre el área de mtespace.

> jstat -printcompilation [pid]

Estadísticas sobre los métodos compilados.

> jstat -class [pid]

Estadísticas sobre los class loaders.

> jstat -compiler [pid]

Estadísticas sobre el compilador JIT.

> jstat [option] [output-options] [pid] [interval] [count]

Y hay algunas opciones más...

Jstat: ejemplo práctico

despegar@h-bkd-shopping-00:~$ jstat -gcutil 18330 1s
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  5.55   0.00  23.36  45.75  93.72  91.37  23124  749.071   104   10.855  759.926
  5.55   0.00  33.67  45.75  93.72  91.37  23124  749.071   104   10.855  759.926
  5.55   0.00  44.54  45.75  93.72  91.37  23124  749.071   104   10.855  759.926
  5.55   0.00  64.37  45.75  93.72  91.37  23124  749.071   104   10.855  759.926
  5.55   0.00  74.08  45.75  93.72  91.37  23124  749.071   104   10.855  759.926
  5.55   0.00  80.24  45.75  93.72  91.37  23124  749.071   104   10.855  759.926
  5.55   0.00  87.50  45.75  93.72  91.37  23124  749.071   104   10.855  759.926
  0.00   7.67  20.10  45.84  93.72  91.37  23125  749.123   104   10.855  759.977
  0.00   7.67  36.74  45.84  93.72  91.37  23125  749.123   104   10.855  759.977
  0.00   7.67  46.46  45.84  93.72  91.37  23125  749.123   104   10.855  759.977
  0.00   7.67  68.73  45.84  93.72  91.37  23125  749.123   104   10.855  759.977
  0.00   7.67  75.11  45.84  93.72  91.37  23125  749.123   104   10.855  759.977
  0.00   7.67  86.45  45.84  93.72  91.37  23125  749.123   104   10.855  759.977
  5.27   0.00   2.21  45.92  93.72  91.37  23126  749.156   104   10.855  760.010

(1)

(2)

En (1) se ve que el Eden tiene 87,5% de ocupación y S0 tiene una ocupación de 5,55% de objetos que sobrevivieron al anterior Young GC.

Hasta aquí el Young-GC se ejecutó 23.124 veces, con un tiempo de pausa total de 749,071 segundos. Y el Old-GC ejecutó 104 veces, con un tiempo de pausa total de 10,855 segundos.

En la linea (2), el Eden bajó a 20,10% , S0 quedó vacío, y S1 quedó con 7,67% de objetos que sobrevivieron. El contador de Young-GC se incrementó a 23.125 y el tiempo total en Young-GC aumentó a 749,123 segundos. La Old aumentó a 45,84% por objetos que fueron promocionados del S0. La Old-GC no se ejecutó.

WIP

¡ Muchas Gracias !

Cristian Spinetta

@c_spinetta

@cspinetta

Bonus!

WIP

Async profiling, flame graph, MAT, false sharing...

JVM troubleshooting tools

By Cristian Spinetta

JVM troubleshooting tools

A short presentation about tools for troubleshooting on the JVM.

  • 152