2014-01-12 105 views
4

我们已经部署在Tomcat 6.0.20我们的补救措施中端,但是Tomcat的几乎每天都下降非常频繁,并出现以下错误:线程处于等待状态 - 的Apache Tomcat

的最大线程数(400 )创建的地址为空和端口8080

我们尝试增加线程的数量,但它只是不够。两次后续崩溃之间的时间差异只是增加,但它是同样的问题。

我们已经获得了线程转储,它显示大多数线程处于“等待”状态。请参考下面从线程日志中获取如下:

*"http-8080-670" - Thread [email protected] 
java.lang.Thread.State: WAITING 
      at sun.misc.Unsafe.park(Native Method) 
      - parking to wait for <775f1471> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
      at java.util.concurrent.locks.LockSupport.park(Unknown Source) 
      at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source) 
      at com.bmc.arsys.apitransport.connection.a.get(Unknown Source) 
      at com.bmc.arsys.apitransport.connection.c.getProxy(Unknown Source) 
      at com.bmc.arsys.api.PoolingProxyManager.getProxy(Unknown Source) 
      at com.bmc.arsys.apitransport.connection.c.getProxy(Unknown Source) 
      at com.bmc.arsys.api.ARServerUser.getListEntryObjects(Unknown Source) 
      at com.remedy.arsys.goat.savesearches.ARUserSearches.loadFromServer(Unknown Source) 
       - locked <32e7e815> (a com.remedy.arsys.goat.savesearches.ARUserSearches) 
      at com.remedy.arsys.goat.aspects.IARUserSearchesServiceCacheAspect.ajc$around$com_remedy_arsys_goat_aspects_IARUserSearchesServiceCacheAspect$1$181ba497(IARUserSearchesServiceCacheAspect.aj:44) 
      - locked <794bbdbc> (a java.lang.String) 
      at com.remedy.arsys.goat.savesearches.ARUserSearches.getUserSearches(Unknown Source) 
      at com.remedy.arsys.goat.UserDataEmitter.<init>(Unknown Source) 
      at com.remedy.arsys.goat.service.DHTMLRequestService.requestDispatch(Unknown Source) 
      at com.remedy.arsys.stubs.FormServlet.doRequest(Unknown Source) 
      at com.remedy.arsys.stubs.GoatServlet.postInternal(Unknown Source) 
      at com.remedy.arsys.stubs.GoatHttpServlet.doGet(Unknown Source) 
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
      at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
      at java.lang.Thread.run(Unknown Source) 
    Locked ownable synchronizers: 
      - locked <5b95bfda> (a  java.util.concurrent.locks.ReentrantLock$NonfairSync)* 

线程处于'等待'有很多原因,任何人都可以帮助缩小范围。

+0

所有其他线程都停留在同一个地方吗?此线程转储只显示一个线程。 –

回答

0

线程似乎在等待,但实际上它们在工作队列中被阻塞。看起来他们使用ThreadPoolExecutor来调度任务,但工作队列中没有足够的线程来处理所有任务,或者每个任务都耗时过长。

看一看:Deadlock in ThreadPoolExecutor

此外,检查PoolingProxyManager,他getProxy应该做什么,它看起来像它试图获得连接或其他资源。

2

线程进入park状态,当它没有给出池中的执行机会(即池中的线程数)时。池指的是当前处于RUN状态的线程。当池被填满时,线程进入队列,该队列将处于WAIT状态,并有机会进入RUN状态,当它有机会进入池中执行时。

poolqueue门槛超过线程进入park WAIT状态,他们将等待,直到下面的事情有人碰巧,

我),当它超过配置的公园超时

ii)获取permit进入poolqueue即;当调用Thread.interrupt()时,线程将有机会进入RUNWAIT状态。

相关问题