2011-05-05 7 views
10

me gustaría preguntar si Java utilizará más recursos de la CPU cuando los hilos están bloqueados, es decir, esperando para bloquear un monitor que actualmente está siendo bloqueado por otro hilo.¿Los subprocesos bloqueados de Java consumen más recursos de la CPU?

Ahora estoy viendo un volcado de subprocesos por el cual algunos subprocesos están bloqueados, ya que están esperando para bloquear un monitor, y no estoy seguro si eso es lo que puede ser responsable del alto uso de la CPU.

Gracias!

EDITAR (6 de mayo de 2011) Se me olvidó mencionar si este comportamiento es relevante para Java SE 1.4.2.

Respuesta

20

Los subprocesos consumen recursos como la memoria. Un hilo de bloqueo/desbloqueo incurre en un costo único. Si un hilo bloquea/desbloquea decenas de miles de veces por segundo, puede desperdiciar cantidades significativas de CPU.

Sin embargo, una vez que se bloquea un hilo, no importa por cuánto tiempo está bloqueado, no hay un costo continuo.

+0

Según la respuesta publicada por @sjlee, llegué a saber que si el spinlock está involucrado con los hilos bloqueados, entonces esto termina causando la utilización de la CPU. Por lo tanto, ¿no crees que decir que los hilos bloqueados son una suposición sin costo ** siempre ** es un poco ** fuerte **? –

+0

Perdóneme pero me encantaría saber su opinión sobre mi comentario anterior. O bien, ¡cualquier enlace o puntero a este tema sería genial! –

+1

@VishalK Hilo bloqueado cuesta menos si bloquean durante un tiempo relativamente largo. p.ej. decenas de milisegundos. Durante un período de tiempo muy corto, el bloqueo puede tener una sobrecarga elevada. –

2

No, los hilos que están bloqueados en un monitor hacen no consumen tiempo de CPU adicional.

1

El hilo suspendido o bloqueado no consume ningún tiempo de CPU.

13

La respuesta no es tan simple. Puede haber casos en los que los hilos que entren en el estado bloqueado puedan terminar causando la utilización de la CPU.

La mayoría de las JVM emplean algoritmos de bloqueo por niveles. A menudo implican algoritmos tales como spinlocks especialmente para bloqueos mantenidos por una corta duración. Cuando un hilo intenta adquirir un monitor y descubre que no puede hacerlo, la JVM puede ponerlo en un bucle y hacer que el hilo intente adquirir el monitor, en lugar de que el contexto lo desconecte inmediatamente. Si el hilo no puede adquirir el bloqueo después de un cierto número de intentos o duración (dependiendo de la implementación de JVM específica), la JVM cambia a un modo de "bloqueo de grasa" o "bloqueo inflado" donde el contexto cambia el hilo.

Es con el comportamiento de spinlock donde puede incurrir en costos de CPU. Si tiene un código que mantiene el bloqueo por muy poco tiempo y la discusión es alta, entonces puede ver un aumento apreciable en la utilización de la CPU. Para algunas discusiones sobre varias técnicas que utilizan las JVM para reducir los costos de contención, consulte http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html.

Cuestiones relacionadas