日期:2014-05-17  浏览次数:21077 次

Tomcat 工作线程只增不减
"http-80-239" daemon prio=6 tid=0x05c1a400 nid=0xcd4 in Object.wait() [0x0945f000]
  java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
- locked <0x2b0a8b40> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
at java.lang.Thread.run(Thread.java:619)

  Locked ownable synchronizers:
- None


使用VisualVM查看tomcat的线程,发现大量类似上面的线程

Overall Thread Count 271
Overall Monitor Count 151
Number of threads waiting for a monitor 0
Number of threads locking a monitor 151
Number of threads sleeping on a monitor 4
Number of deadlocks 0
Number of Monitors without locking threads 0

而且没有任何关于本身程序的信息

tomcat 
<Connector port="80" useBodyEncodingForURI="true" URIEncoding = "UTF-8" connectionTimeout="20000" maxThreads="1000" minSpareThreads="30" maxSpareThreads="75" enableLookups="false" maxIdleTime="15000" 
  acceptCount="100" 
  disableUploadTimeout="true"/>
的配置是否有问题,还是有其他的原因



------解决方案--------------------
tomcat
lz可以从网上查下最优配置
有关优化方案挺多的
------解决方案--------------------
JIoEndpoint 里面的 IOEndPoint 和 $Worker 这样的名字再加上里面没有你的程序的包名和类名出现那就不是你的程序的问题,IOEndPoint 多那可能是刚才的并发量很大,开启的线程放在池中,当有请求进来时,tomcat 会调用 at org.apache.tomcat.util.net.JIoEndpoint$Worker 的 notify 过程释放锁,这样这个 worker 对于的 JIoEndPoint 就去处理 IO 事件,IO 中的 byte 读取了就相应的会继续后面的 HTTP 请求,它这个 JIoEndPoint 在等待 NIO 异步 socket channel 的 TCP 事件的通知,通知收到了锁自然就解除了。