2011-12-28 23 views
10

Estaba perfilando mi aplicación usando JProfiler y como resultado, en la sección "Vistas de CPU" muestra que más del 40% del tiempo de CPU se usa en Object.wait(). Sin embargo, por lo que sé en Object.wait() CPU no se le da al hilo de espera.CPU Usage y Object.wait

¿Podría alguien ayudar a entender qué está pasando y por qué el generador de perfiles muestra que esta gran parte de la CPU se gasta en Object.wait()?

+0

¿Está utilizando varios hilos o solo uno? ¿Es esta una aplicación GUI o un servidor? – Kylar

+0

Es una aplicación no GUI que contiene muchos subprocesos, entre 40 y 60 subprocesos. Algunos hilos están esperando E/S de red y otros están esperando responder a las solicitudes que reciben usando E/S. – Faramarz

Respuesta

6

El generador de perfiles no sabe que la CPU está inactiva en wait(). Todo lo que el perfilador sabe es que se ingresó wait(), y varios milisegundos más tarde regresó. Entonces, si esos milisegundos tienden a ocupar el 40% de tu tiempo de ejecución, ahí lo tienes.

+0

Depende del generador de perfiles. Por ejemplo, YourKit definitivamente sabe medir el tiempo de CPU: http://www.yourkit.com/docs/10/help/times.jsp –

+0

@EliAcherkan Sí, y ni siquiera estoy seguro de que jprofiler no lo sepa; pero no hay otra explicación. La única otra cosa que podría especular es que si tienes un hilo en un circuito cerrado haciendo nada más que 'wait()' y otro hilo en un ciclo cerrado haciendo nada más que 'notify()' entonces supongo que es probable que 'wait() 'de hecho consumiría un gran porcentaje de la CPU, no porque sea costoso en sí mismo, sino porque realmente no estaríamos haciendo otra cosa. Pero eso es muy poco probable. –

2

40% de qué? Supongamos que perfilar el siguiente código:

for (i = 0; i < 1000; i++){ 
    sleep(1); 
} 

Si nos fijamos sólo en tiempo de CPU (no la hora del reloj de pared), casi todos los que estarán en sleep.

¿Por qué? Porque está usando muy poco tiempo de CPU, pero del tiempo de CPU es usando usando, nealy todo se gasta ingresando y saliendo sleep.

Por supuesto, si mira el reloj de pared, aún más estará en sleep.

Igual va para cualquier llamada de bloqueo, como wait.

+0

Gracias a todos. Probaré con otro generador de perfiles como YourKit para ver lo que me dice. – Faramarz