首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >100线程在tomcat中TIMED_WAITING,导致它在线程总数超过200时停止

100线程在tomcat中TIMED_WAITING,导致它在线程总数超过200时停止
EN

Stack Overflow用户
提问于 2012-06-04 17:20:52
回答 2查看 24.8K关注 0票数 16

最近,我们的一个生产tomcat服务器变得没有响应,因为tomcat的繁忙线程数激增到200。当我们在重启前进行线程转储时,我们有100个线程处于TIMED_WAITING状态,就像下面这3个线程:

代码语言:javascript
复制
""http-bio-7007"-exec-241" daemon prio=10 tid=0x00002aaab107b000 nid=0x59df waiting on condition [0x0000000051239000]
java.lang.Thread.State: TIMED_WAITING (parking)
   at sun.misc.Unsafe.park(Native Method)
   - parking to wait for  <0x0000000580d877d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
   at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)
   at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424)
   at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86)
   at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
   at java.lang.Thread.run(Thread.java:662)

""http-bio-7007"-exec-237" daemon prio=10 tid=0x00002aaab186e000 nid=0x596d waiting on condition [0x000000004d1f9000]
java.lang.Thread.State: TIMED_WAITING (parking)
   at sun.misc.Unsafe.park(Native Method)
   - parking to wait for  <0x0000000580d877d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
   at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)
   at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424)
   at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86)
   at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
   at java.lang.Thread.run(Thread.java:662)

""http-bio-7007"-exec-236" daemon prio=10 tid=0x00002aaab1118000 nid=0x596c waiting on condition [0x000000004e50c000]
java.lang.Thread.State: TIMED_WAITING (parking)
   at sun.misc.Unsafe.park(Native Method)
   - parking to wait for  <0x0000000580d877d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
   at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)
   at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424)
   at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86)
   at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
   at java.lang.Thread.run(Thread.java:662)

我们有4个应用程序的线程池(例如pool-4- thread -20等),每个线程都有20个线程,所以我不确定这100个线程在哪个阻塞队列上等待?我们使用的是c3P0连接池和hibernate,这似乎不是原因。

你知道java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject是什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-30 13:53:22

当我们修复了泄漏由c3p0管理的DB连接的代码时,这个问题得到了修复。在我们的代码中有几个流,在关闭finally块中的实体管理器之前,我们没有专门在catch块中调用rollback(),所以在出现异常的情况下,连接不会返回到池中,如果异常频率很高(在超时间隔内超过池的大小),那么所有其他进程线程都会堆积起来获取连接。

票数 10
EN

Stack Overflow用户

发布于 2012-07-30 14:54:58

你知道java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject是什么吗?

在队列内部使用ConditionObject来同步不同线程对队列的访问。

当你的执行池的一个线程空闲并等待新的任务时,它就是标准的堆栈跟踪。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10878983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档