由于浸泡测试期间阻塞的线程,Tomcat 6.0.28没有响应

时间:2013-08-05 08:52:49

标签: java multithreading tomcat garbage-collection deadlock

我们为在Tomcat 6.0.28和OpenJDK Runtime Environment(IcedTea6 1.11.11)上运行的新版Java EE Web应用程序运行了几次浸泡测试。问题出现在Web层中。

经过一段时间 - 第一次50分钟,第二次1小时,第三次2.5小时 - 我们的群集Web层中的一个随机Tomcat停止响应。看看线程转储,我们看到大量线程突然阻塞。

当问题发生时,线程数从93增加到437.在43个线程中有341个在WebappClassLoader上被阻止,如下所示:

"TP-Processor400" daemon prio=10 tid=0x00007f1ee432e800 nid=0x44d9 waiting for monitor entry [0x00007f1ec47c5000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java)
        - waiting to lock <0x00000006f561a758> (a org.apache.catalina.loader.WebappClassLoader)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329)

一个线程持有锁:

"TP-Processor53" daemon prio=10 tid=0x00007f1ee406f800 nid=0x7cbf runnable [0x00007f1f4545b000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ClassLoader.findLoadedClass0(Native Method)
        at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:923)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1386)
        - locked <0x00000006f561a758> (a org.apache.catalina.loader.WebappClassLoader)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329)

以一分钟为间隔的后续线程转储显示锁被释放,然后由其他一些线程获取。 2分钟后,所有被阻止的线程都被解锁,服务器再次正常运行。

在Tomcat错误跟踪器上报告了WebappClassLoader的死锁问题,应用程序使用自己的类加载器(https://issues.apache.org/bugzilla/show_bug.cgi?id=48694https://issues.apache.org/bugzilla/show_bug.cgi?id=48903的副本),我们也是如此:我们的应用程序嵌入在集群OpenCMS安装中,该安装使用org.opencms.ocee.base.CmsReloadingClassLoader来加载类。

当阻塞发生时,我们也看到GC活动从CPU时间的10%增加到50%,即使内存和堆在那时没有增加。

问题是这种阻塞是由什么引起的,我们可以做些什么来解决它?

1 个答案:

答案 0 :(得分:0)

显然,死锁的原因和修复程序存在于错误本身的注释中。查看https://bz.apache.org/bugzilla/show_bug.cgi?id=48694

的评论