我们正在处理应用程序中的性能问题,并且我们在线程转储中发现了以下行为。
有一个拥有montior锁但仍处于阻塞状态的线程。
INT:legacon:41:76" prio=10 tid=0x0000000055df0800 nid=0x2e39 waiting for monitor entry [0x00002aaacb4d4000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.leg.common.connections.fg.FgConnection.send(FgConnection.java:342)
- locked <0x00000007345b78c0> (a java.io.BufferedOutputStream)
at com.leg.mg.core.po.storage.ReplicationConnection.send(ReplicationConnection.java:190)
at com.leg.mg.core.po.storage.ClusterStorageManager.replicate(ClusterStorageManager.java:620)
at com.leg.mg.core.po.poEngine.store(poEngine.java:1117)
at com.leg.mg.core.po.poWorker.storeMessage(poWorker.java:1024)
at com.leg.mg.proto.RWorker$DocumentMessageSender.run(RouterWorker.java:1976)
at com.leg.common.threadpool.VirtualThreadGroup$VirtualThreadGroupRunnable.run(VirtualThreadGroup.java:147)
at com.leg.common.threadpool.ThreadControl.run(ThreadControl.java:201)
at com.leg.common.threadpool.ThreadPool$PoolThread.run(ThreadPool.java:742)
相应的代码块是
line 250 out = new BufferedOutputStream(socket.getOutputStream(), BUFFER_LENGTH);
line 331 public void send(Object obj, boolean flush) throws ConnectionException {
.
.
line 342 synchronized(out) {
. if(!isOpen()) {
. throw new ConnectionException("Connection closed", url);
. }
.
. header.reset();
. header.write(B_SEND_EX);
. header.write((byte)'\r');
. header.write((byte)'\n');
. int len = splitInt(val.length);
. while (len-- > 0) {
. header.write(splitBuffer[len]);
. }
. header.write((byte)'\r');
. header.write((byte)'\n');
. header.writeTo(out);
. out.write(val);
. if (flush) {
. out.flush();
. }
. }
line 364}
根据上面的堆栈跟踪,它拥有montor lock on&#34; out&#34;在第342行。但它仍处于阻塞状态。 Aslo,它说等待监视器输入[0x00002aaacb4d4000]。 我们无法识别哪个是0x00002aaacb4d4000以及谁拥有锁定,因为除了整个线程转储中的这个位置之外,0x00002aaacb4d4000没有其他事件发生。
即使在拥有监视器锁定之后线程如何处于阻塞状态?
如何识别什么是0x00002aaacb4d4000?它会是任何内部java对象吗?
Java version: jdk1.6.0_32
如果你能帮助我们理解这个案例,真的很棒。