Domanda

In questo thread dump:

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)

Cosa fa la linea

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

significare? Avevamo altri 8 thread bloccati in attesa java/lang/Class@0x067EA070 Per essere rilasciato, che questo thread tiene, ma non capisco cosa stesse bloccando questo thread, né cosa significhi che il blocco è stato rilasciato. Avrei pensato che un dump di thread fosse un tipo di evento stop-the-world, e quindi la linea in questione non si riferirebbe al blocco che veniva rilasciato mentre il dump thread stava accadendo ...

Inoltre, dove sembra avere qualche significato (cioè la linea sopra di essa e sotto di essa)?

Ovviamente non sono un Java, quindi spero che questo non sia troppo stupido. Grazie per l'aiuto!

È stato utile?

Soluzione

Dal Oracle Jrockit JDK Strumenti Guida,

La semantica per l'attesa (per la notifica) per un oggetto in Java è in qualche modo complessa. Innanzitutto, per inserire un blocco sincronizzato, è necessario prendere il blocco per l'oggetto, quindi si chiama Wait () su quell'oggetto. Nel metodo di attesa, il blocco viene rilasciato prima che il thread vada a dormire in attesa di una notifica. Quando il thread riceve una notifica, wait () ritrae il blocco prima di tornare. Se un thread ha preso un blocco e sta aspettando una notifica su quel blocco, la linea nella traccia dello stack che descrive quando è stato preso il blocco non viene mostrata come (tenendo il blocco); Viene mostrato come (blocco rilasciato durante l'attesa.)

In altre parole, significa che il suddetto thread ha un oggetto che ha acquisito un blocco prima, e poi in un secondo momento lo ha rilasciato, quando ha invocato object.wait(). Il modello di codice simile al comportamento è:

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

Aggiornare

Guardando la traccia dello stack, sembra che tu stia usando i fagioli EJB di entità e, dato il modo in cui tali implementazioni operano, le serrature vengono generalmente acquisite sull'entità EJBS. Questo dipenderebbe effettivamente dal Strategia di concorrenza Utilizzato per la gestione delle transazioni simultanee che devono accedere al database. Sospetterei che il numero di fagioli sia troppo basso o che c'è solo un fagiolo da bloccare.

Altri suggerimenti

Cerca "blocco rilasciato" in questa pagina e che fornisce una spiegazione abbastanza buona di ciò che sta accadendo all'interno della logica dell'attesa sull'oggetto.

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

Sembra che questo messaggio rappresenti quando la chiamata Wait () originale che viene notifica () ED riconquista il blocco dell'oggetto.

Per riferimento futuro, l'ho trovato solo facendo una ricerca su Google su "Lock rilasciato in attesa" e questa è stata la prima pagina che è apparsa ... spero che tu abbia già fatto una ricerca in rete e non sei stato soddisfatto di ciò che tu Trovato, nel qual caso mi dispiace se questo non aiuta.

Molto probabilmente si riferisce alla voce due righe sopra:

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

Wait () rilascerà il blocco attualmente tenuto (il blocco detenuto dal blocco sincronizzato circostante) e attenderà un segnale di notifica ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top