2016-09-06 104 views
2

我们遇到这种情况,其中超过100个线程停留在weblogic(10.3.6)受管服务器中。weblogic classloader中的滞留线程

我分析threaddump和找到150个线程阻塞在类加载器等待锁,如: "jmsContainer-14" prio=10 tid=0x00007f11485d7000 nid=0x14c8 waiting for monitor entry [0x00007f1023590000] java.lang.Thread.State: BLOCKED (on object monitor) at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:48) - waiting to lock <0x0000000782aeb288> (a weblogic.utils.classloaders.ChangeAwareClassLoader) at ch.qos.logback.classic.spi.PackagingDataCalculator.loadClass(PackagingDataCalculator.java:207)

(10 OCCURENCES)

"[STUCK] ExecuteThread: '30' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007f10d002d800 nid=0x5ea5 waiting for monitor entry [0x00007f1136eeb000] java.lang.Thread.State: BLOCKED (on object monitor) at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:48) - waiting to lock <0x0000000782aeb288> (a weblogic.utils.classloaders.ChangeAwareClassLoader) at javax.xml.datatype.FactoryFinder.getProviderClass(FactoryFinder.java:115) at javax.xml.datatype.FactoryFinder.newInstance(FactoryFinder.java:181)

(137 )发生

没有所有卡住的线程被阻塞原因相同,但我们有150个线程正在等待锁定相同的锁< 0x0000000782aeb288>,我觉得很奇怪,因为它在classLoader中。

我不认为这是我们现在正在经历的问题的根源,但如果有人能够解释这种行为,它可能会有很大的帮助。

感谢

编辑:

这里是阻塞线程:

ExecuteThread '136' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007f11484af800 nid=0x7640 runnable [0x00007f102c11b000] 
    java.lang.Thread.State: RUNNABLE 
    at sun.nio.cs.UTF_8$Encoder.encode(UTF_8.java:632) 
    at java.util.zip.ZipCoder.getBytes(ZipCoder.java:86) 
    at java.util.zip.ZipFile.getEntry(ZipFile.java:306) 
    - locked <0x0000000782b2ddf8> (a java.util.jar.JarFile) 
    at java.util.jar.JarFile.getEntry(JarFile.java:226) 
    at weblogic.utils.classloaders.ZipClassFinder.getSource(ZipClassFinder.java:39) 
    at weblogic.utils.classloaders.JarClassFinder.getSource(JarClassFinder.java:50) 
    at weblogic.utils.classloaders.AbstractClassFinder.getClassSource(AbstractClassFinder.java:31) 
    at weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 
    at weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 
    at weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 
    at weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 
    at weblogic.application.utils.CompositeWebAppFinder.getClassSource(CompositeWebAppFinder.java:88) 
    at weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 
    at weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 
    at weblogic.utils.classloaders.CodeGenClassFinder.getClassSource(CodeGenClassFinder.java:25) 
    at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:291) 
    - eliminated <0x0000000782aeb288> (a weblogic.utils.classloaders.ChangeAwareClassLoader) 
    at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270) 
    at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64) 
    at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:49) 
    - locked <0x0000000782aeb288> (a weblogic.utils.classloaders.ChangeAwareClassLoader) 
    at javax.xml.datatype.FactoryFinder.getProviderClass(FactoryFinder.java:115) 
    at javax.xml.datatype.FactoryFinder.newInstance(FactoryFinder.java:181) 

对不起,我应该早点贴吧。

几乎所有的线程都bloked中,或者通过含有这一段代码两行代码一种封端:

DatatypeFactory.newInstance().newXMLGregorianCalendar(dateDebCre)

显然的Weblogic试图很难连连加载相同的罐。我不明白,因为它应该存储在内存中的缓存中,对吗?

首先,我们将删除这些代码行,因为它们完全无用(令人遗憾)。但是,我认为再次理解这个问题会更好。

谢谢

回答

0

首先,你需要找出是谁在持有锁< 0x0000000782aeb288>。如果可能的话附上完整的线程转储,以便我可以看看。

0

从线程转储它也看起来像源代码试图从zip文件中读取数据。如果文件的大小很大,则可能导致潜在问题 如果您正在linux上运行,那么如果进程正在执行大量IO,则可以检入/ var/proc目录