【问题标题】:Tomcat Deadlock in Thread线程中的Tomcat死锁
【发布时间】:2013-09-08 01:55:45
【问题描述】:

我将 Tomcat 7.0.42 用于使用 websockets 的应用程序。如果我的应用程序负载过重,我会在一些使用 websockets 的线程中遇到死锁。

由于我找不到解决方法,是否有解决此问题的方法?

我使用 Atmpshere 2.0RC3 runtime-native。

这是我的线程转储的相关部分。我使用 Samurai 来检测死锁的线程。

     "Atmosphere-Shared-AsyncOp-267"   daemon prio=10 tid=0x00007efed8118000 nid=0x2eb5 waiting for monitor entry [0x00007efe798ca000]      java.lang.Thread.State: BLOCKED (on object monitor)      at org.apache.catalina.websocket.WsOutbound.writeTextMessage(WsOutbound.java:165)      - waiting to lock <0x00000005ef4c6988> (a org.apache.catalina.websocket.WsOutbound)      
at org.atmosphere.container.version.TomcatWebSocket.write(TomcatWebSocket.java:49)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:199)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:168)   
   at org.atmosphere.websocket.WebSocket.write(WebSocket.java:40)     
 at org.atmosphere.cpr.AtmosphereResponse$2.write(AtmosphereResponse.java:574)      
at org.atmosphere.handler.AbstractReflectorAtmosphereHandler.onStateChange(AbstractReflectorAtmosphereHandler.java:169)      
at org.atmosphere.cpr.DefaultBroadcaster.invokeOnStateChange(DefaultBroadcaster.java:1027)   
   at org.atmosphere.cpr.DefaultBroadcaster.prepareInvokeOnStateChange(DefaultBroadcaster.java:1047)    
  at org.atmosphere.cpr.DefaultBroadcaster.executeAsyncWrite(DefaultBroadcaster.java:921)     
 at org.atmosphere.cpr.DefaultBroadcaster$3.run(DefaultBroadcaster.java:580)      - locked <
    0x00000005ef4b77f8> (a org.atmosphere.cpr.AtmosphereResourceImpl)     
 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)  
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)   
   at java.util.concurrent.FutureTask.run(FutureTask.java:166)    
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)     
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)    
  at java.lang.Thread.run(Thread.java:724)  


    "Atmosphere-Scheduler-2"   daemon prio=10 tid=0x00007efee9c77800 nid=0x257d waiting for monitor entry [0x00007efe831ef000]      java.lang.Thread.State: BLOCKED (on object monitor)      
at org.atmosphere.cpr.AsynchronousProcessor.completeLifecycle(AsynchronousProcessor.java:476)      - waiting to lock <0x00000005ef4b77f8> (a org.atmosphere.cpr.AtmosphereResourceImpl)     
 at org.atmosphere.cpr.AsynchronousProcessor.timedout(AsynchronousProcessor.java:437)      
at org.atmosphere.cpr.AsynchronousProcessor$AsynchronousProcessorHook.timedOut(AsynchronousProcessor.java:633)     
 at org.atmosphere.websocket.DefaultWebSocketProcessor.close(DefaultWebSocketProcessor.java:483)      
at org.atmosphere.container.TomcatWebSocketHandler.onClose(TomcatWebSocketHandler.java:80)      
at org.apache.catalina.websocket.StreamInbound.doOnClose(StreamInbound.java:222)      
at org.apache.catalina.websocket.WsOutbound.doWriteBytes(WsOutbound.java:423)      
at org.apache.catalina.websocket.WsOutbound.doWriteText(WsOutbound.java:442)      
at org.apache.catalina.websocket.WsOutbound.writeTextMessage(WsOutbound.java:174)      - locked <
    0x00000005ef4c6988> (a org.apache.catalina.websocket.WsOutbound)      
at org.atmosphere.container.version.TomcatWebSocket.write(TomcatWebSocket.java:49)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:199)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:168)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:40)      
at org.atmosphere.cpr.AtmosphereResponse$2.write(AtmosphereResponse.java:574)      
at org.atmosphere.cpr.AtmosphereResponse.write(AtmosphereResponse.java:992)      
at org.atmosphere.interceptor.HeartbeatInterceptor$1$1.call(HeartbeatInterceptor.java:104)      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)      
at java.util.concurrent.FutureTask.run(FutureTask.java:166)      
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)     
 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)     
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)     
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)  
    at java.lang.Thread.run(Thread.java:724)

【问题讨论】:

  • 你用的是哪个氛围版本?
  • @SzymonBiliński 我使用 Atmpshere 2.0RC3 runtime-native
  • 两个线程都在等待锁定243f01c7waiting to lock &lt;...&gt;),但是在这个上面看不到锁定它的线程(locked &lt;...&gt;)。我认为您应该照顾它(并且可能将其包含在问题中)。
  • @Katona 我用死锁的线程更新了我的问题。我用武士来检测它们。这对你有帮助吗?或者这可能对您有帮助:github.com/Atmosphere/atmosphere/issues/1264
  • @confile 是的,那个问题似乎是同一个问题,我认为是 Atmosphere 的问题,我在 github 上发表了评论。

标签: java tomcat servlets tomcat7 deadlock


【解决方案1】:

Tomcat 错误!!! 您需要将 Tomcat 更新到最新版本或进行如下配置:

在你的 web.xml 中添加:

  <init-param>
      <param-name>org.atmosphere.cpr.Broadcaster.writeTimeout</param-name>
      <param-value>VALUE</param-value>
  </init-param>

VALUE 以毫秒为单位,我建议 20000 - 30000。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2018-06-16
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多