2010-11-13 11 views
6

Normalmente, cuando solicito un volcado de hebras, los síntomas de un sistema de bajo rendimiento se explican fácilmente; es decir, normalmente podría ver que varios hilos están esperando claramente en un monitor que ha sido adquirido pero no lanzado por otro.Subprocesos de Java en espera para bloquear el objeto que no está (visiblemente) bloqueado

En este caso, tengo una gran cantidad de subprocesos esperando un monitor (0x965ad100), pero ninguno parece tener ese monitor en primer lugar. Los hilos en cuestión pueden ser identificados con esta firma:

de espera para bloquear < 0x965ad100> (un uk.gov.dti.og.fox.ConAgent)

he tratado de buscar en Google esto, y todo lo que parezco son publicaciones que hablan de monitores que están bloqueados, nada de esperar que un monitor no esté bloqueado.

volcado de rosca en su totalidad: http://www.basson.at/docs/stackoverflow/thread_dump.txt

espero que alguien aquí puede explicar lo que estoy viendo, o al menos me punto en la dirección correcta. Gracias de antemano por cualquier respuesta.

+0

Por cierto, es mejor que ver lo que es de rosca-9 haciendo, porque está esperando a que la misma cerradura que ya ha adquirido (0x96560c48) –

Respuesta

1

Es posible (aunque poco probable) que un hilo acaba de soltar el monitor cuando se realizó el volcado de hilo. Puede haber un breve período entre el lanzamiento de un monitor y el siguiente subproceso. Si no estás en un punto muerto real, esto podría explicar lo que estás viendo. Pruebe con otro volcado de hilo y verifique uno.

Es más probable que haya un hilo en alguna parte que ya contenga el monitor. A veces no es obvio. Sus trazas de pila tienen algunas líneas "bloqueadas" que enumeran los hilos que contienen ciertos bloqueos, pero esa lista no es necesariamente completa. Por ejemplo, sospecho que los bloqueos obtenidos a través de JNI no están en la lista.

Si puede reemplazar el candado incorporado con, p. Ej. java.util.concurrent.locks.ReentrantLock, entonces puede suspender el programa y adjuntar un depurador, encontrar el bloqueo que le interesa y encontrar el propietario del bloqueo utilizando el método getOwner.

1

Si está utilizando Eclipse, puede usar el visor de bloqueo incorporado a través de la vista de depuración que podría ser útil. Puede activarlo usando el menú desplegable accesible a través de la flecha hacia abajo en la barra de herramientas :)

alt text

Cuestiones relacionadas