Pregunta

En este volcado de hilo:

INFO   | jvm 3    | 2011/06/08 13:36:12 | "ExecuteThread: '38' for queue: 'default'" id=55 idx=0x78 tid=5316 prio=5 alive, in native, waiting, daemon
INFO   | jvm 3    | 2011/06/08 13:36:12 |     -- Waiting for notification on: weblogic/ejb20/locks/ExclusiveLockManager$LockWaiter@0x25EF8828[fat lock]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at jrockit/vm/Threads.waitForSignal(J)Z(Native Method)
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at java/lang/Object.wait(J)V(Native Method)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/locks/ExclusiveLockManager$LockBucket.lock(Ljava/lang/Object;Ljava/lang/Object;I)Z(ExclusiveLockManager.java:504)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     ^-- Lock released while waiting: weblogic/ejb20/locks/ExclusiveLockManager$LockWaiter@0x25EF8828[fat lock]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/locks/ExclusiveLockManager.lock(Ljava/lang/Object;Ljava/lang/Object;I)Z(ExclusiveLockManager.java:261)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/manager/ExclusiveEntityManager.acquireLock(Ljava/lang/Object;Ljavax/transaction/Transaction;I)Z(ExclusiveEntityManager.java:210)[inlined]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/manager/ExclusiveEntityManager.getReadyBean(Ljava/lang/Object;Ljavax/transaction/Transaction;I)Ljavax/ejb/EntityBean;(ExclusiveEntityManager.java:267)[inlined]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/manager/ExclusiveEntityManager.preInvoke(Lweblogic/ejb20/internal/InvocationWrapper;)Ljavax/ejb/EnterpriseBean;(ExclusiveEntityManager.java:242)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/internal/BaseEJBObject.preInvoke(Lweblogic/ejb20/internal/InvocationWrapper;Lweblogic/security/service/ContextHandler;)Lweblogic/ejb20/internal/InvocationWrapper;(BaseEJBObject.java:152)[inlined]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/internal/EntityEJBObject.preInvoke(Lweblogic/ejb20/internal/MethodDescriptor;Lweblogic/security/service/ContextHandler;)Lweblogic/ejb20/internal/InvocationWrapper;(EntityEJBObject.java:104)[inlined]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/ejb/commodity/ejb_Commodity_etfd4i_EOImpl.getData()Lfoob/ejb/commodity/db/CommodityData;(ejb_Commodity_etfd4i_EOImpl.java:701)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/ejb/item/OurItem.loadCommodityData()V(OurItem.java:172)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     ^-- Holding lock: java/lang/Class@0x067EA070[fat lock]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/ejb/item/OurItem.getCommodityData()Lfoob/ejb/commodity/db/CommodityData;(OurItem.java:251)
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/ejb/item/OurItem.getTheControlGid()Ljava/lang/String;(OurItem.java:259)
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/business/shipment/OurThing.getTheControlGid(Lfoob/util/jdbc/OurConnection;)Ljava/lang/String;(OurThing.java:379)

Que hace la línea

Lock released while waiting: weblogic/ejb20/locks/ExclusiveLockManager$LockWaiter@0x25EF8828

¿significar? Tuvimos otros 8 hilos bloqueados esperando java/lang/Class@0x067EA070 Para ser liberado, que este hilo está sosteniendo, pero no entiendo en qué estaba bloqueando este hilo, ni qué significa que se liberó el bloqueo. Hubiera pensado que un volcado de hilo es un tipo de evento de parada en el mundo, y por lo tanto la línea en cuestión no se referiría a la cerradura que se libera mientras el volcado de hilo estaba sucediendo ...

Además, ¿dónde parece tener algún significado (es decir, la línea sobre ella y debajo de ella)?

Obviamente, no soy un Java, así que espero que esto no sea una pregunta demasiado estúpida. ¡Gracias por la ayuda!

¿Fue útil?

Solución

Desde el Guía de herramientas de Oracle JRockit JDK,

La semántica para esperar (para notificar) para un objeto en Java es algo complejo. Primero, para ingresar un bloque sincronizado, debe tomar el bloqueo para el objeto y luego llamar a Wait () en ese objeto. En el método de espera, el bloqueo se libera antes de que el hilo se duerma esperando una notificación. Cuando el hilo recibe una notificación, espere () vuelva a tomar el bloqueo antes de regresar. Si un hilo ha tomado un bloqueo y está esperando una notificación sobre ese bloqueo, la línea en la traza de la pila que describe cuándo se tomó el bloqueo no se muestra como (bloqueo de mantenimiento); Se muestra como (Lock Lanzado mientras espera).

En otras palabras, significa que dicho hilo tiene un objeto que adquirió un bloqueo antes, y luego en un punto posterior lo lanzó, cuando invocó object.wait(). El patrón de código similar al comportamiento es:

synchronized(lock) //acquires the lock
{
   ...
   do some work
   ...
   object.wait(); //releases the lock, and waits for a notification
}

Actualizar

Al mirar el rastreo de la pila, parece que está utilizando la entidad EJB Beans, y dada la manera en que funcionan tales implementaciones, los bloqueos generalmente se adquieren en la entidad EJBS. Esto realmente dependería del estrategia de concurrencia Se utiliza para administrar transacciones concurrentes que tienen que acceder a la base de datos. Sospecharía que el número de frijoles es demasiado bajo o solo hay un frijol para bloquear.

Otros consejos

Busque "Lock Lanzado" en esta página y eso proporciona una explicación bastante buena de lo que está sucediendo dentro de la lógica de esperar en el objeto.

http://download.oracle.com/docs/cd/e13188_01/jrockit/docs142/userguide/apstkdmp.html

Parece que este mensaje representa cuando la llamada Wait () original que se notifica () ed recupera el bloqueo del objeto.

Para referencia futura, encontré esto simplemente haciendo una búsqueda en Google en "Lock Lanzado mientras espera" y esta fue la primera página que apareció ... con suerte ya hiciste una búsqueda en la red y no estuvo satisfecho con lo que tú Encontrado, en cuyo caso lo siento si esto no ayuda.

Lo más probable es que se relacione con la entrada dos líneas arriba:

at java/lang/Object.wait(J)V(Native Method)[optimized]

Wait () lanzará el bloqueo actualmente retenido (el bloqueo mantenido por el bloque sincronizado circundante) y espere una señal notify ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top