GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿cómo rastrear un programa Java?

Como administrador de sistemas, a veces me enfrento a situaciones en las que un programa se comporta de manera anormal, sin crear ningún error o creando mensajes de error sin sentido.

En el pasado, antes de que llegara Java, había dos contramedidas:

  1. Si nada más ayuda, RTFM 😉
  2. Si incluso 1. no ayuda, rastree las llamadas al sistema y vea qué está sucediendo

Usualmente uso strace -f para esta tarea con Linux (otros sistemas operativos tienen herramientas de rastreo similares). Ahora bien, aunque esto suele funcionar bien para cualquier programa antiguo, el seguimiento se vuelve muy confuso cuando se hace lo mismo en un java. -proceso. Hay tantas llamadas al sistema que aparentemente no están relacionadas con ninguna acción real, que es terrible buscar en un basurero de este tipo.

¿Hay mejores formas de hacerlo (si el código fuente no está disponible)?

Respuesta aceptada:

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, recuentos de subprocesos y uso del almacenamiento dinámico, lo que es ideal para rastrear fugas.

Otra herramienta, jstat , puede recopilar estadísticas de recolección de elementos no utilizados 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 rastreo. 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.

Relacionado:Linux:¿encontrar una subcadena en archivos en subdirectorios con un solo comando incorporado?

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.


Linux
  1. Cómo usar BusyBox en Linux

  2. Cómo instalar Python en Linux

  3. Cómo uso cron en Linux

  4. Cómo instalar Java en Linux

  5. Cómo particionar un disco en Linux

Cómo crear un archivo en Linux

Cómo cambiar el nombre de los directorios en Linux

Cómo rastrear la ejecución del programa usando el comando Strace de Linux

Cómo instalar FreeOffice en Linux

Cómo rastrear y rastrear un proceso de Linux

¿Cómo rastrear un programa java?