Si tiene una aplicación Java que consume CPU cuando no hace nada, ¿cómo se determina qué está haciendo?

StackOverflow https://stackoverflow.com/questions/12927

  •  08-06-2019
  •  | 
  •  

Pregunta

Estoy llamando a la API de Java de un proveedor y en algunos servidores parece que la JVM entra en un ciclo de sondeo de baja prioridad después de iniciar sesión en la API (CPU al 100% de uso).La misma aplicación en otros servidores no presenta este comportamiento.Esto sucede en WebSphere y Tomcat.El entorno es complicado de configurar, por lo que es difícil intentar hacer algo como crear perfiles dentro de Eclipse.

¿Hay alguna manera de generar un perfil (o algún otro método de inspección) de una aplicación Java existente que se ejecuta en Tomcat para averiguar qué métodos se están ejecutando mientras se encuentra en este tipo de estado de espera de giro?La aplicación solo ejecuta un método cuando llega a este estado (método del proveedor).El proveedor no puede replicar el comportamiento (por supuesto).


Actualizar:

Usando JConsole pude determinar quién estaba corriendo y qué estaban haciendo.Me tomó algunas horas descubrir por qué lo estaba haciendo.El problema terminó siendo que el jar API del proveedor que se estaba utilizando no coincidía exactamente con la configuración de la base de datos que se estaba utilizando.De forma predeterminada, el seguimiento y la supervisión del rendimiento estaban habilitados en los servidores que tenían una ligera discrepancia en la configuración.Usé un frasco diferente y todo está bien.

Así que gracias Josué por tu respuesta.JConsole fue extremadamente fácil de configurar y usar para monitorear una aplicación existente.

@Cringe: experimenté un poco con algunas de las opciones que sugeriste.Tuve algunos problemas al configurar JProfiler, se ve bien (pero es caro).En el futuro, seguí adelante y agregué el complemento Eclipse Profiler y revisaré los diferentes perfiladores de código abierto para comparar la funcionalidad.

¿Fue útil?

Solución

Si está utilizando Java 5 o posterior, puede conectarse a su aplicación usando jconsola para ver todos los hilos en ejecución.jstack también realizará un volcado de pila.Creo que esto debería funcionar incluso dentro de un contenedor como Tomcat.

Ambas herramientas están incluidas con JDK5 y versiones posteriores (supongo que el proceso debe ser al menos Java 5, aunque podría estar equivocado)

Actualizar:También vale la pena señalar que a partir de la actualización 7 de JDK 1.6 ahora hay un generador de perfiles incluido llamado visualvm que se puede iniciar con 'jvisualvm'.Parece que es un proyecto java.net, por lo que es posible que haya información adicional disponible en esa página.No lo he usado todavía, pero parece útil para análisis más serios.

Espero que ayude

Otros consejos

Enfrentando el mismo problema que usé Perfilador YourKit.Su cargador no se activa a menos que realmente te conectes a él (aunque abre un puerto para escuchar las conexiones).El generador de perfiles en sí tiene una buena "cantidad de tiempo invertido en cada método" mientras trabaja en su modo menos molesto.

Otra forma es detectar la carga de la CPU (a través de JNI, por lo que necesitaría una biblioteca externa para esto) en un subproceso "vigilante" con la prioridad más alta y comenzar a registrar todos los subprocesos cuando la CPU esté lo suficientemente alta durante un tiempo suficientemente largo.Podrías encontrar Este artículo esclarecedor.

Si es para fines profesionales y tienes algo de dinero para gastar, intenta conseguirlo. JProfiler.Si solo desea obtener algunas ideas, pruebe el Complemento de perfilador de Eclipse.Lo usé varias veces, pero no sé el estado actual.

También está disponible un nuevo proyecto (?) del propio proyecto eclipse: http://www.eclipse.org/tptp/ (Ver Este artículo).Nunca lo usé, así que no sé si vale la pena el esfuerzo.

También hay una muy buena lista de generadores de perfiles de código abierto disponibles en http://www.manageability.org/blog/stuff/open-source-profilers-for-java

Analizador de latencia de control de misión JRockit.

El Analizador de Latencia que viene con JRockit le muestra lo que "hace" la JVM cuando no está haciendo nada.En la última versión puedes ver las latencias para:

  • Java espera/bloqueado/suspensión/estacionado.
  • E/S de archivos
  • E/S de red
  • Asignación de memoria
  • GC se detiene
  • Latencias JVM, por ejemplo, generación de código y carga de clases.
  • Suspensión de hilo

La herramienta le proporcionará el seguimiento de la pila cuando se produjo la latencia.Puede ver los datos de latencia de muchas maneras diferentes (trazas agregadas, como un histograma, en un gráfico de subprocesos, etc.).La herramienta también le permite ver las transiciones entre subprocesos, por ejemplo, cuando un subproceso notifica a otro.

analizador de latencia http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

Los gastos generales son insignificantes y, a diferencia de muchas otras herramientas, se puede utilizar en un entorno de producción.Este entrada en el blog te da una breve introducción y el programa se puede descargar aquí.

¡Es de uso gratuito para el desarrollo!

Si JConsole no se puede utilizar, puedes

  • prensa CONTROL+ROMPER bajo Windows
  • enviar kill -3 <process id> bajo linux

para obtener un volcado de subprocesos completo.Esto no afecta el rendimiento y siempre se puede ejecutar en producción.

Utilice un perfilador. Sí, cuestan dinero y su uso puede resultar un poco incómodo en ocasiones, pero proporcionan mucha más evidencia real que conjeturas.

Los seres humanos son universalmente malos a la hora de adivinar dónde están los cuellos de botella en el rendimiento.Simplemente parece ser algo que nuestros cerebros no están preparados para hacerlo muy bien.Puede parecer obvio, es posible que tengas grandes ideas sobre cuál es el problema, pero a menudo resulta que el mundo real hace algo diferente.Y optimizar la parte incorrecta del código significa, en el mejor de los casos, mucho trabajo para obtener un beneficio mínimo.Más a menudo hace que las cosas sean más lentas y, a veces, las estropea por completo.Por lo tanto, antes de realizar cambios con fines de optimización, debe siempre tener evidencia real de un perfilador u otra herramienta precisa.

Como se mencionó, tanto JProfiler como YourKit son bastante buenos y no prohibitivamente caros.La última vez que miré, ambos también tenían demostraciones gratuitas.

En aras de la integridad:Aunque mi empresa está más o menos estandarizada en Eclipse, utilizamos Netbeans (6 y superiores) con su incluido, perfilador gratuito diariamente.Funciona mejor que el complemento TPTP de Eclipse (comprobado por última vez hace 3 meses) y para nosotros elimina cualquier necesidad de un generador de perfiles comercial como JProfiler, que es excelente, pero rápidamente se vuelve innecesario.

VisualVM debería ser el generador de perfiles de netbeans de forma independiente.Probé el TPTP para eclipse, ¡pero visualVm parece una opción mucho mejor!

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