Como mencionó ckhan, jstack
es excelente porque brinda el seguimiento completo de la pila de todos los subprocesos activos en la JVM. Lo mismo se puede obtener en stderr de la JVM usando SIGQUIT.
Otra herramienta útil es jmap
que puede tomar un volcado de pila del proceso JVM usando el PID del proceso:
jmap -dump:file=/tmp/heap.hprof $PID
Este volcado de pila se puede cargar en herramientas como visualvm
(que ahora es parte de la instalación estándar de Oracle java sdk, llamada jvisualvm). Además, VisualVM puede conectarse a la JVM en ejecución y mostrar información sobre la JVM, incluida la visualización de gráficos del uso interno de la CPU, el recuento de subprocesos y el uso del almacenamiento dinámico, lo que es ideal para rastrear fugas.
Otra herramienta, jstat
, puede recopilar estadísticas de recolección de basura para la JVM durante un período de tiempo similar a vmstat cuando se ejecuta con un argumento numérico (por ejemplo, vmstat 3
).
Finalmente, es posible usar un agente Java para impulsar la instrumentación en todos los métodos de todos los objetos en el momento de la carga. La biblioteca javassist
puede ayudar a que esto sea muy fácil de hacer. Por lo tanto, es factible agregar su propio seguimiento. La parte difícil de eso sería encontrar una manera de obtener resultados de seguimiento solo cuando lo desea y no todo el tiempo, lo que probablemente ralentizaría la JVM. Hay un programa llamado dtrace
que funciona de una manera como esta. Lo he intentado, pero no tuve mucho éxito. Tenga en cuenta que los agentes no pueden instrumentar todas las clases porque las que se necesitan para iniciar la JVM se cargan antes de que el agente pueda instrumentar, y luego es demasiado tarde para agregar instrumentación a esas clases.
Mi sugerencia - Comience con VisualVM y vea si eso le dice lo que necesita saber, ya que puede mostrar los subprocesos actuales y estadísticas importantes para la JVM.
Del mismo modo, al depurar programas que han fallado en un sistema Linux, puede usar herramientas similares para depurar JVM en ejecución en su sistema.
Herramienta n.º 1:jvmtop
Similar a top
, puede usar jvmtop para ver en qué clases están las JVM en ejecución en su sistema. Una vez instalado lo invocas así:
$ jvmtop.sh
Su salida tiene un estilo similar para parecerse a la herramienta top
:
JvmTop 0.8.0 alpha amd64 8 cpus, Linux 2.6.32-27, load avg 0.12
http://code.google.com/p/jvmtop
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31
19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20
16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46
Herramienta n.º 2:jvmmonitor
Otra alternativa es usar jvmmonitor. JVM Monitor es un perfilador de Java integrado con Eclipse para monitorear el uso de la CPU, los subprocesos y la memoria de las aplicaciones Java. Puede usarlo para encontrar automáticamente JVM en ejecución en el host local o puede conectarse a JVM remotas usando un [email protected]
Herramienta n.° 3:VisualVM
visualvm es probablemente "la herramienta" a la que recurrir al depurar problemas con la JVM. Su conjunto de funciones es bastante profundo y puede obtener una mirada muy profunda a las entrañas.
Perfile el rendimiento de la aplicación o analice la asignación de memoria:
Tomar y mostrar volcados de hilos:
Referencias
- tutorial de VisualVM
Considere jstack
.No coincide exactamente con strace
, más de un pstack
-analógico, pero al menos le dará una imagen de una instantánea en el tiempo. Podría unirlos para obtener un rastro crudo si fuera necesario.
Consulte también las sugerencias en este artículo SO:https://stackoverflow.com/questions/1025681/call-trace-in-java