2010-06-01 21 views
14

Tengo un gran programa en Java que usa multihilo. En algunos casos, el programa comienza a usar el 100% de los tres núcleos de mi sistema de ocho núcleos. En uso normal, el programa usa todos los núcleos al 1-2%. ¿Cómo puedo encontrar la clase que está sobrecargando núcleos?¿Cómo encontrar una clase intensiva de CPU en Java?

+2

En general, una clase no está sobrecargando su máquina, podría ser un método en particular. – Uri

Respuesta

1

Intente tomar el volcado de subprocesos (consulte los comandos jps, jstack) y luego vea qué métodos se ejecutan.

+0

Simplemente mirando qué métodos se ejecutan con más frecuencia no es lo mismo que averiguar dónde gasta el programa la mayor parte de su tiempo de procesamiento. – Jesper

+0

@Jesper: Haga esto algunas veces como 10, luego busque las declaraciones que están en varias muestras de la pila. Entonces, la fracción de muestras que contiene una línea es la fracción de tiempo de la que es responsable la línea, y no se gastaría sino para esa línea. El concepto de "donde el programa pasa su tiempo" ignora la responsabilidad de las llamadas a métodos que causan que el tiempo se gaste en niveles más bajos. –

+0

@Mike Mi punto es que debe medir cuánto tiempo se gasta en qué partes del programa, no solo cuántas veces se llaman los métodos. Puede tener un método que se llama 1,000 veces pero usa solo el 10% del tiempo, o un método que se llama 100 veces pero usa el 90% del tiempo del programa. Para optimizar, debe concentrarse en el método llamado con menos frecuencia en tal caso. – Jesper

15

Utilice un generador de perfiles tales como el jvisualvm que se incluye con jdk-1.6.0_10

+2

Es posible que desee buscar el lazo de espera ocupado : '(while! done) {}'. Rara vez un hilo escrito correctamente estará haciendo un trabajo significativo al 100%, generalmente el cómputo es ocasionalmente bloqueado por E/S o sincronización. - un buen gráfico de uso de CPU debe verse ligeramente ondulado. – Justin

4

Utilice un perfilador de averiguar qué hilo (s) están utilizando todos sus ciclos de la CPU, y el método (s) que están ejecutando.

2

Si va a utilizar la ruta de perfilador comercial, le recomiendo usar Dynatrace.

+0

Ridícula costosa tanto financiera como en términos de gastos generales. http://williamlouth.wordpress.com/2010/05/25/the-java-application-performance-management-vendor-showdown/ –

+0

No estoy seguro de lo caro que es, pero me pareció más útil que JProbe .Los caminos puros de Dynatrace son muy minuciosos y dividen los informes muy bien en el nivel de método, nivel de SQL, nivel de API. Puede usar el perfilador de cliente para ver la ejecución del script java, los tiempos de llamada ajax, los tiempos de renderización, los tiempos de red. Estoy seguro de que probablemente tenga un precio. Es por eso que dije que si el OP gasta el dinero para obtener un comercial, podría verificarlo. – CoolBeans

1

Si está utilizando Java sobre UNIX o algunas versiones de Linux, busque en DTrace con Java.

+0

En realidad, las sondas dtrace para JVM son bastante caras en tiempo de ejecución. Sondas de OpenCore vs sondas de DTrace Java http://opencore.jinspired.com/?page_id=190 –

6

La mejor solución es utilizar un generador de perfiles - que es lo que están construidos para, y hay un gran uno liado con Java 6.

Otro (lejos de ser tan ideales una solución) es ejecutar su programa en el Eclipse IDE (si eso es lo que usa) en modo de depuración. Luego puede ver los hilos en ejecución. SI muchos de ellos están suspendidos, el que no es podría ser el culpable. Haga que se rompa (desde la barra de herramientas) y podrá ver dónde está. Hay muchas posibilidades de que encuentres un ciclo claro u ocupado esperando.

Cuestiones relacionadas