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?

¿Fue útil?

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:  ingrese la descripción de la imagen aquí

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

¡Solucione el problema antes de que ocurra!Utilice una herramienta de análisis estático como FindBugs o PMD como parte de su sistema de compilación.No encontrará todo, pero es un buen primer paso.

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top