使用工具对resion容器进行大量并发访问 resion容器不久后出现僵死.
执行 kill -3 后 获得大量如下信息 (所有线程都是.)
"resin-tcp-connection-192.168.253.72:61318-593" daemon prio=1 tid=0x00002aaaae1f0b10 nid=0x5051 in Object.wait() [0x000000005c717000..0x000000005c717c20]
at java.lang.Object.wait(Native Method)
- waiting on (a java.util.ArrayList)
at java.lang.Object.wait(Object.java:474)
at com.caucho.server.log.AccessLogWriter.write(AccessLogWriter.java:132)
- locked (a java.util.ArrayList)
at com.caucho.server.log.AccessLog.flush(AccessLog.java:604)
- locked (a java.lang.Object)
at com.caucho.server.log.AccessLog.log(AccessLog.java:317)
- locked (a java.lang.Object)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:191)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:208)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:259)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:363)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:490)
at com.caucho.util.ThreadPool.run(ThreadPool.java:423)
at java.lang.Thread.run(Thread.java:595)
"resin-tcp-connection-192.168.253.72:61318-595" daemon prio=1 tid=0x00002aaaae1f0220 nid=0x5050 waiting for monitor entry [0x000000005c616000..0x000000005c616ca0]
at com.caucho.server.log.AccessLog.log(AccessLog.java:315)
- waiting to lock (a java.lang.Object)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:191)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:208)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:259)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:363)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:490)
at com.caucho.util.ThreadPool.run(ThreadPool.java:423)
at java.lang.Thread.run(Thread.java:595)
resin自身应该不会有这种bug,应该是使用不当造成的。
给几个建议:
1,是否有自定义的filter里面对某些对象进行了同步,尤其查看一下和日志相关的代码;
2,如果有resin源码,可以搜索一下代码,看看那个ArrayList在哪里被notify了,到底同步的是什么资源,是不是日志文件等等;
初看好像是死锁,waiting for monitor entry是等待相应锁的释放吧,信息还不全吧,你可以根据每隔线程的堆栈分析出它的行为,然后综合所有线程的行为判断实在哪里死锁了。
比如第一个线程:执行WebAppFilterChain.doFilter时获得了对象锁0x00002b0e07627598,然后再获得一个锁0x00002b0e07627750,并在此对象上面等待然后释放锁;
而第二个线程等待获得锁0x00002b0e07627598,第一个线程没有释放这个锁。
单纯从这些信息来看,需要有线程notify这个锁0x00002b0e07627750的对象,线程1和2才会继续往下走。
如果你有源码的话,在eclipse里面选定这个list变量,Ctrl+Shift+G可以搜索工程里面的所有引用