线程挂起导致其他线程挂起

时间:2012-02-08 23:29:25

标签: java multithreading

以下方法可能导致线程挂起,从而导致其他线程挂起,最终构建堆栈并导致应用服务器崩溃?

private static Hashtable content = new Hashtable();
private static int cleanout;

private static void cleanoutCache() {

    if(cleanout > 50000) {

        synchronized(PollCacheManager.class) {

            Enumeration emu = content.keys();

            while(emu.hasMoreElements()) {

                String key = (String)emu.nextElement();

                PollCacheStore bean = (PollCacheStore)content.get(key);

                if((System.currentTimeMillis() - bean.getLastInitialized()) > 86400000) {

                    content.remove(key);

                }

            }

            // reset cleanout
            cleanout = 0;

        }

    }

}

感谢您的帮助


我已经粘贴了运行我的测试用例时生成的线程转储的快照,模拟了我之前在my previous question中提到的问题。

所有“Servlet.Engine.Transports”线程都与我的应用程序相关。看来他们都在监视器上等待。但没有提供关于他们正在等待什么资源的进一步细节。我在分析这些线程转储方面有点新意。似乎不是僵局,不是竞争条件而不是资源争用。但是,在我的负载测试工具的结果中,进程挂起很明显。谢谢你的帮助

完整的线程转储:

"Thread-1727" prio=5 tid=0x2aea620 nid=0x9a2 waiting on monitor [0xb6481000..0xb6481a00]
    at java.lang.Thread.sleep(Native Method)
    at com.ibm.websphere.personalization.util.timer.PznTimerEvents.run(PznTimerEvents.java:222)
    at java.lang.Thread.run(Thread.java:479)

"Thread-1683" daemon prio=5 tid=0x1a21668 nid=0x973 runnable [0xb4581000..0xb4581a00]
    at java.net.SocketInputStream.socketRead(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:85)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:181)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:220)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:275)
    at com.sun.jndi.ldap.Connection.run(Connection.java:581)
    at java.lang.Thread.run(Thread.java:479)

"Thread-1682" daemon prio=5 tid=0x4ed830 nid=0x972 runnable [0xb5301000..0xb5301a00]
    at java.net.SocketInputStream.socketRead(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:85)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:181)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:220)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:275)
    at com.sun.jndi.ldap.Connection.run(Connection.java:581)
    at java.lang.Thread.run(Thread.java:479)

"Thread-1681" daemon prio=5 tid=0x1ec1a20 nid=0x971 runnable [0xb5401000..0xb5401a00]
    at java.net.SocketInputStream.socketRead(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:85)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:181)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:220)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:275)
    at com.sun.jndi.ldap.Connection.run(Connection.java:581)
    at java.lang.Thread.run(Thread.java:479)

"Servlet.Engine.Transports : 387" daemon prio=5 tid=0x15386f8 nid=0x943 waiting on monitor [0xb4781000..0xb4781a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Servlet.Engine.Transports : 385" daemon prio=5 tid=0x51e898 nid=0x93e waiting on monitor [0xb3281000..0xb3281a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Servlet.Engine.Transports : 384" daemon prio=5 tid=0x464760 nid=0x93d waiting on monitor [0xb3381000..0xb3381a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Servlet.Engine.Transports : 382" daemon prio=5 tid=0x1141de8 nid=0x8a0 waiting on monitor [0xb3581000..0xb3581a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Servlet.Engine.Transports : 380" daemon prio=5 tid=0x1151ad8 nid=0x6b5 waiting on monitor [0xb3e81000..0xb3e81a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Servlet.Engine.Transports : 366" daemon prio=5 tid=0x1a1d110 nid=0x3fb waiting on monitor [0xb4b81000..0xb4b81a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Servlet.Engine.Transports : 365" daemon prio=5 tid=0x4e8bd8 nid=0x3fa waiting on monitor [0xb6281000..0xb6281a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Servlet.Engine.Transports : 362" daemon prio=5 tid=0x17055b0 nid=0x3f7 waiting on monitor [0xb3481000..0xb3481a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Servlet.Engine.Transports : 356" daemon prio=5 tid=0x1ddbae0 nid=0x3f1 waiting on monitor [0xb9c01000..0xb9c01a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Servlet.Engine.Transports : 299" daemon prio=5 tid=0x2519028 nid=0x3b5 waiting on monitor [0xb6001000..0xb6001a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"SoapConnectorThreadPool : 3" daemon prio=5 tid=0x15d49f0 nid=0x1ae waiting on monitor [0xb2e81000..0xb2e81a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Alarm : 3" daemon prio=5 tid=0x1d24c48 nid=0xa5 waiting on monitor [0xb6381000..0xb6381a00]
    at java.lang.Object.wait(Native Method)
    at com.ibm.ws.util.BoundedBuffer.poll(BoundedBuffer.java:192)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"Keep-Alive-Timer:" daemon prio=8 tid=0x1ec9a38 nid=0x99 waiting on monitor [0xb3f81000..0xb3f81a00]
    at java.lang.Thread.sleep(Native Method)
    at sun.net.www.http.KeepAliveCache.run(KeepAliveCache.java:130)
    at java.lang.Thread.run(Thread.java:479)

"Thread-64" daemon prio=5 tid=0x4ee700 nid=0x98 waiting on monitor [0xb4081000..0xb4081a00]
    at java.lang.Thread.sleep(Native Method)
    at com.ibm.ejs.j2c.poolmanager.TaskTimer.run(TaskTimer.java:119)

"RT=7:P=908030:O=0:WSTCPTransportConnection[addr=10.24.189.74,port=47148,local=9812]" daemon prio=5 tid=0x4c73f8 nid=0x97 runnable [0xb4181000..0xb4181a00]
    at java.net.SocketInputStream.socketRead(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:85)
    at com.ibm.rmi.iiop.Connection.readMoreData(Connection.java:909)
    at com.ibm.rmi.iiop.Connection.createInputStream(Connection.java:742)
    at com.ibm.rmi.iiop.Connection.doReaderWorkOnce(Connection.java:2447)
    at com.ibm.rmi.transport.ReaderThread.run(ReaderPoolImpl.java:138)

"RT=6:P=908030:O=0:WSTCPTransportConnection[addr=10.24.189.74,port=9812,local=47148]" daemon prio=5 tid=0x3b7860 nid=0x96 runnable [0xb4281000..0xb4281a00]
    at java.net.SocketInputStream.socketRead(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:85)
    at com.ibm.rmi.iiop.Connection.readMoreData(Connection.java:909)
    at com.ibm.rmi.iiop.Connection.createInputStream(Connection.java:742)
    at com.ibm.rmi.iiop.Connection.doReaderWorkOnce(Connection.java:2447)
    at com.ibm.rmi.transport.ReaderThread.run(ReaderPoolImpl.java:138)

"Thread-63" daemon prio=5 tid=0x1666990 nid=0x91 waiting on monitor [0xb4681000..0xb4681a00]
    at java.lang.Thread.sleep(Native Method)
    at com.ibm.ws.management.RoutingTable$PingThread.run(RoutingTable.java:1025)

"ProcessDiscovery : 0" daemon prio=5 tid=0x1c7b4c8 nid=0x8b waiting on monitor [0xb4881000..0xb4881a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"SoapConnectorThreadPool : 2" daemon prio=5 tid=0x1b82798 nid=0x8a waiting on monitor [0xb4981000..0xb4981a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"SoapConnectorThreadPool : 1" daemon prio=5 tid=0x1505188 nid=0x89 waiting on monitor [0xb4a81000..0xb4a81a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"ORB.thread.pool : 1" daemon prio=5 tid=0x24cfd20 nid=0x83 waiting on monitor [0xb4c81000..0xb4c81a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"ORB.thread.pool : 0" daemon prio=5 tid=0x15025c0 nid=0x82 waiting on monitor [0xb4d81000..0xb4d81a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
    at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:422)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:669)

"RT=5:P=908030:O=0:WSSSLTransportConnection[addr=10.25.168.38,port=33762,local=46854]" daemon prio=5 tid=0x1520f20 nid=0x81 runnable [0xb4e81000..0xb4e81a00]
    at java.net.SocketInputStream.socketRead(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:85)
    at com.ibm.sslite.t.a(Unknown Source)
    at com.ibm.sslite.t.b(Unknown Source)
    at com.ibm.sslite.t.a(Unknown Source)
    at com.ibm.sslite.a.read(Unknown Source)
    at com.ibm.jsse.a.read(Unknown Source)
    at com.ibm.rmi.iiop.Connection.readMoreData(Connection.java:909)
    at com.ibm.rmi.iiop.Connection.createInputStream(Connection.java:742)
    at com.ibm.rmi.iiop.Connection.doReaderWorkOnce(Connection.java:2447)
    at com.ibm.rmi.transport.ReaderThread.run(ReaderPoolImpl.java:138)

"Thread-53" prio=5 tid=0x29558 nid=0x1 waiting on monitor [0..0xffbedb10]

"java.net.MulticastSocket@4b3966" prio=5 tid=0x17dacf8 nid=0x80 runnable [0xb4f81000..0xb4f81a00]
    at java.net.PlainDatagramSocketImpl.receive(Native Method)
    at java.net.DatagramSocket.receive(DatagramSocket.java:387)
    at com.ibm.ws.management.discovery.transport.MulticastServer.run(MulticastServer.java:196)
    at java.lang.Thread.run(Thread.java:479)

"ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9044]" prio=5 tid=0x157f330 nid=0x7f runnable [0xb5981000..0xb5981a00]
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463)
    at java.net.ServerSocket.implAccept(ServerSocket.java:238)
    at java.net.ServerSocket.accept(ServerSocket.java:217)
    at com.ibm.jsse.bg.accept(Unknown Source)
    at com.ibm.ws.http.HttpTransport.run(HttpTransport.java:235)
    at java.lang.Thread.run(Thread.java:479)

"ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9091]" prio=5 tid=0x15d10c0 nid=0x7e runnable [0xb5a81000..0xb5a81a00]
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463)
    at java.net.ServerSocket.implAccept(ServerSocket.java:238)
    at java.net.ServerSocket.accept(ServerSocket.java:217)
    at com.ibm.ws.http.HttpTransport.run(HttpTransport.java:235)
    at java.lang.Thread.run(Thread.java:479)

"ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9444]" prio=5 tid=0x1693c28 nid=0x7d runnable [0xb5b81000..0xb5b81a00]
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463)
    at java.net.ServerSocket.implAccept(ServerSocket.java:238)
    at java.net.ServerSocket.accept(ServerSocket.java:217)
    at com.ibm.jsse.bg.accept(Unknown Source)
    at com.ibm.ws.http.HttpTransport.run(HttpTransport.java:235)
    at java.lang.Thread.run(Thread.java:479)

"ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9081]" prio=5 tid=0x24d2f78 nid=0x7c runnable [0xb5e01000..0xb5e01a00]
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463)
    at java.net.ServerSocket.implAccept(ServerSocket.java:238)
    at java.net.ServerSocket.accept(ServerSocket.java:217)
    at com.ibm.ws.http.HttpTransport.run(HttpTransport.java:235)
    at java.lang.Thread.run(Thread.java:479)

"Dispatcher-Thread-52" daemon prio=1 tid=0x509da0 nid=0x7b waiting on monitor [0xb5f01000..0xb5f01a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at org.apache.log4j.Dispatcher.run(AsyncAppender.java:293)

"Thread-51" prio=5 tid=0x254138 nid=0x7a waiting on monitor [0xb5c81000..0xb5c81a00]
    at java.lang.Thread.sleep(Native Method)
    at com.ibm.wcm.jobs.Scheduler.run(Scheduler.java:68)
    at java.lang.Thread.run(Thread.java:479)

"wcp_1328597020006" prio=5 tid=0x2a5c628 nid=0x76 waiting on monitor [0xb6101000..0xb6101a00]
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:415)
    at com.ibm.wcp.analysis.util.MultiAccessQueue.dequeue(MultiAccessQueue.java:223)
    at com.ibm.wcp.analysis.event.ListenerThread.run(ListenerThread.java:87)

.....更多(由于此处的字符限制)

3 个答案:

答案 0 :(得分:1)

你应该将你的"清理工作移到50000以上"在同步块内部进行测试,以确保所有线程都能看到其值的最新版本,该版本在方法结束时进行了修改。

其余的看起来没问题,只要对"内容"进行所有其他访问。 "清理"变量也受到" PollCacheManager.class"的保护。监视器(包括读取)。

答案 1 :(得分:1)

虽然问题中提供的代码可能代表瓶颈(在静态字段/类对象上进行同步),但只要我们可以假设执行线程将会出现,它就不会对您可能看到的任何活动问题负责。能够在合理的时间内遍历Hashtable中的键。

但请注意,如果PollCacheManager可公开访问,则PollCacheManager的类对象同步,因为外部代码可能获取PollCacheManager类对象的锁定,因此同步无限延迟执行线程(详见this page)。

如果您遇到应用程序挂起,最好的办法是触发一个线程转储(只需向JVM发送一个SIGQUIT(Unix上的kill -3),Windows上的Ctrl-Break)并分析堆栈跟踪。

答案 2 :(得分:0)

我会让整个函数同步,假设您正在使用此同步,我想知道您为什么使用Hashtable(也是同步的)?

您是否可能遇到某些竞争条件,因为对此哈希表的某些其他访问权限不受同一锁的保护?