¿Cómo encontrar un bucle infinito en una aplicación web java?
-
28-10-2019 - |
Pregunta
Un día, nuestra aplicación web Java llega al 100% del uso de la CPU. Un reinicio soluciona la incidencia pero no el problema porque pocas horas después el problema volvió. Sospechamos un bucle infinito introducido por una nueva versión, pero no hicimos ningún cambio en el código o en el servidor.
Logramos encontrar el problema haciendo varios volcados de hilo con kill -QUIT y mirando y comparando los detalles de cada hilo. Encontramos que una pila de llamadas de subprocesos aparece en todos los volcados de subprocesos. Después del análisis, hubo una condición de ciclo while que nunca se volvió falsa para algunos datos que se actualizaban regularmente en la base de datos.
El análisis de varios volcados de subprocesos de aplicaciones web es realmente tedioso.
Entonces, ¿conoce alguna forma o herramientas mejores para encontrar este problema en un entorno de producción?
Solución
Después de algunas consultas, encontré una respuesta en Supervisión y administración de Java Aplicaciones de la plataforma SE 6 :
Puede diagnosticar subprocesos en bucle utilizando la herramienta proporcionada por JDK llamada JTop que mostrará el tiempo de CPU que utiliza cada subproceso:
Con el nombre del hilo, puede encontrar el rastro de la pila de este hilo en la pestaña "Subprocesos" de haciendo un volcado de hilo con un kill -QUIT.
Ahora puede concentrarse en el código que causa el bucle infinito.
PD: parece correcto responder a mi propia pregunta de acuerdo con http: / /blog.stackoverflow.com/2008/07/stack-overflow-private-beta-begins/ : […] “sí, está bien e incluso se le anima a que responda sus propias preguntas, si encuentra una buena respuesta antes que nadie”. […]
PD .: En caso de que el dominio sun.com ya no exista: Puede ejecutar JTop como una GUI independiente:
$ <JDK>/bin/java -jar <JDK>/demo/management/JTop/JTop.jar
Alternativamente, puede ejecutarlo como un complemento de JConsole:
$ <JDK>/bin/jconsole -pluginpath <JDK>/demo/management/JTop/JTop.jar
Otros consejos
Piense en utilizar herramientas de cobertura como Cobertura. Le habría mostrado que no probó estas rutas de código.
Probando algo.como esto puede volverse realmente engorroso, así que intente evitarlo introduciendo medidas de calidad.
De todos modos, herramientas como VisualVM le brindarán una buena descripción general de todos los subprocesos, por lo que resulta relativamente fácil identificar los subprocesos que funcionan durante un tiempo inesperadamente largo.