我们遇到的情况是,weblogic(10.3.6)托管服务器中存在超过100个线程。
我正在分析一个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次出现)
或
"[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个线程等待锁定同一个锁&lt; 0x0000000782aeb288&gt;,我觉得奇怪,因为它在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)
抱歉,我应该早点发布。
几乎所有线程都被包含这段代码的两行代码中的一行填充或阻塞:
DatatypeFactory.newInstance().newXMLGregorianCalendar(dateDebCre)
显然,Weblogic正在努力一次又一次地加载同一个jar。我不明白,因为它应该存储在内存中的缓存中,对吗?
首先,我们将删除这些代码行,因为它们完全没用(遗憾的是)。但同样,我认为理解问题会更好。
谢谢
答案 0 :(得分:0)
首先,你需要找出谁持有锁&lt; 0x0000000782aeb288&gt;。如果可能的话,附上完整的线程转储,以便我可以看看。
答案 1 :(得分:0)
从线程转储看起来,源代码也试图从zip文件中读取数据。如果文件的大小很大,那么它可能会导致潜在的问题 如果你在linux上运行,那么你可以检查/ var / proc目录,如果进程正在执行大量的IO