Cuando trabajamos con Java, una de las herramientas más conocidas para monitoreo es VisualVM.
Nos permite analizar memoria, CPU, hilos, GC y mucho más… todo desde una interfaz gráfica muy cómoda.
Pero hay un problema: ¿Qué pasa cuando estás en un servidor sin entorno gráfico?
Ahí es donde VisualVM ya no alcanza.
Java ya trae todo lo necesario… solo que más low level.
1. jps – listar procesos Java
jps -l
Salida típica:
1234 com.miapp.Main
5678 org.apache.catalina.startup.Bootstrap
Es el primer paso: obtener el PID.
2. jstat – métricas del GC
jstat -gc 1234 1000
Muestra:
- uso de memoria
- comportamiento del Garbage Collector
- generaciones (Eden, Survivor, Old)
Ideal para detectar problemas de memoria en vivo.
3. jstack – dump de hilos
jstack 1234
Te da:
- todos los threads
- estados (RUNNABLE, BLOCKED, etc.)
- posibles deadlocks
Clave para debugging de concurrencia.
4. jmap – análisis de memoria
jmap -heap 1234
O histogramas:
jmap -histo 1234
Podés ver qué objetos están ocupando memoria.
5. jcmd – el reemplazo moderno
Esta es la más importante.
jcmd 1234 help
Ejemplos:
jcmd 1234 GC.heap_info
jcmd 1234 Thread.print
jcmd 1234 GC.run
Es como un “super comando” que reemplaza a varios anteriores.
Veamos un ejemplo:
En entornos reales se suele hacer esto:
1. Servidor (Linux sin GUI)
- Aplicación Java corriendo
- JMX habilitado
2. Diagnóstico:
- CLI (jcmd, jstat, etc.)
- o conexión remota desde VisualVM
Este enfoque es estándar en sistemas productivos.
VisualVM no es “la herramienta”, es solo un cliente visual.
Las verdaderas herramientas son:
- APIs internas de la JVM
- JMX
- comandos como jcmd
VisualVM simplemente las consume y las muestra bonito.

No hay comentarios.:
Publicar un comentario