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?
Respuesta
Intente tomar el volcado de subprocesos (consulte los comandos jps, jstack) y luego vea qué métodos se ejecutan.
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
@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. –
@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
Utilice un generador de perfiles tales como el jvisualvm que se incluye con jdk-1.6.0_10
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
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.
Si está utilizando Eclipse, puede usar el TPTP profiling tool.
Si va a utilizar la ruta de perfilador comercial, le recomiendo usar Dynatrace.
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/ –
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
Si está utilizando Java sobre UNIX o algunas versiones de Linux, busque en DTrace con Java.
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 –
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.
- 1. ¿Cuáles son las mejores opciones actuales para paralelizar una aplicación .NET intensiva en CPU?
- 2. Ejecutar una tarea intensiva de CPU/memoria: ¿qué enfoque de codificación es el más eficaz?
- 3. ¿Podemos acelerar las tareas intensivas de CPU en Java?
- 4. Encontrar una clase de enumeración usando Reflection en Java
- 5. ¿Cómo puedo encontrar referencias de una clase en Eclipse?
- 6. Configuración de java para usar una CPU
- 7. Tiempo de ejecución de CPU en Java
- 8. cómo encontrar clases de Java?
- 9. java usando 100% cpu
- 10. Cómo crear una clase dinámicamente en Java
- 11. Cómo encontrar el tamaño de una clase en C#
- 12. Cómo encontrar cada instancia de una clase en Ruby
- 13. Cómo encontrar una palabra completa en una cadena en java
- 14. Muy poca utilización de CPU en Java
- 15. generar carga de CPU en Java
- 16. Cómo encontrar una instancia de clase en una JVM en ejecución
- 17. ¿Puedo usar Terracotta para escalar una aplicación intensiva de RAM?
- 18. Carga de CPU desde Java
- 19. Cómo encontrar la causa de un uso de CPU 100% en una aplicación de iPhone
- 20. Cómo llegar reloj de la CPU máximo en Java
- 21. ¿Cómo reviso el uso de CPU y memoria en Java?
- 22. ¿Cómo encontrar un padre con una clase conocida en jQuery?
- 23. ¿Hay una CPU que ejecute Java en microcódigo?
- 24. Cómo encontrar fácilmente la fuente de una clase de Android
- 25. ¿Cómo encontrar la longitud de una clase de matriz?
- 26. Java dinámicamente Cargando una clase
- 27. Python: ¿Cómo se puede encontrar el consumo de CPU para una pieza de código?
- 28. Encontrar subclases de una clase en Object-C
- 29. Encontrar el orden más alto 1 en una primitiva Java
- 30. Comprueba si una clase es una subclase de otra clase en Java
En general, una clase no está sobrecargando su máquina, podría ser un método en particular. – Uri