Java weblogic类加载器中的线程卡住

Java weblogic类加载器中的线程卡住,java,weblogic,classloader,weblogic-10.x,Java,Weblogic,Classloader,Weblogic 10.x,我们遇到的情况是,weblogic(10.3.6)管理的服务器中有100多个线程 我正在分析一个线程转储,发现150个线程被阻塞,等待类加载器中的锁,如: “jmsContainer-14”优先级=10 tid=0x00007f11485d7000 nid=0x14c8等待监视器输入[0x00007f1023590000] java.lang.Thread.State:阻塞(在对象监视器上) 在weblogic.utils.classloaders.ChangeAwareClassLoader.

我们遇到的情况是,weblogic(10.3.6)管理的服务器中有100多个线程

我正在分析一个线程转储,发现150个线程被阻塞,等待类加载器中的锁,如:
“jmsContainer-14”优先级=10 tid=0x00007f11485d7000 nid=0x14c8等待监视器输入[0x00007f1023590000]
java.lang.Thread.State:阻塞(在对象监视器上)
在weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:48)
-等待锁定(weblogic.utils.classloaders.ChangeAwareClassLoader)
位于ch.qos.logback.classic.spi.PackagingDataCalculator.loadClass(PackagingDataCalculator.java:207)

(10次)

“[stack]ExecuteThread:'30'用于队列:'weblogic.kernel.Default(自调优)'”守护进程prio=10 tid=0x00007f10d002d800 nid=0x5ea5等待监视器条目[0x00007f136eeb000]
java.lang.Thread.State:阻塞(在对象监视器上)
在weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:48)
-等待锁定(weblogic.utils.classloaders.ChangeAwareClassLoader)
位于javax.xml.datatype.FactoryFinder.getProviderClass(FactoryFinder.java:115)
位于javax.xml.datatype.FactoryFinder.newInstance(FactoryFinder.java:181)

(137)发生

没有,所有被卡住的线程都因为同样的原因被阻塞,但是我们有150个线程在等待锁定同一个锁,我觉得这很奇怪,因为它在类加载器中

我不认为这是我们现在遇到的问题的根本原因,但如果有人能解释这种行为,那将是非常有帮助的

谢谢

编辑:

下面是阻塞线程:

    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)
队列:“weblogic.kernel.Default(自调优)”的ExecuteThread“136”守护进程prio=10 tid=0x00007f11484af800 nid=0x7640可运行[0x00007f102c11b000] java.lang.Thread.State:可运行 在sun.nio.cs.UTF_8$Encoder.encode(UTF_8.java:632) 位于java.util.zip.ZipCoder.getBytes(ZipCoder.java:86) 位于java.util.zip.ZipFile.getEntry(ZipFile.java:306) -锁定(一个java.util.jar.jar文件) 位于java.util.jar.JarFile.getEntry(JarFile.java:226) 位于weblogic.utils.classloaders.ZipClassFinder.getSource(ZipClassFinder.java:39) 位于weblogic.utils.classloaders.JarClassFinder.getSource(JarClassFinder.java:50) 位于weblogic.utils.classloaders.AbstractClassFinder.getClassSource(AbstractClassFinder.java:31) 位于weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 位于weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 位于weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 位于weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 位于weblogic.application.utils.CompositeWebAppFinder.getClassSource(CompositeWebAppFinder.java:88) 位于weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 位于weblogic.utils.classloaders.MultiClassFinder.getClassSource(MultiClassFinder.java:58) 位于weblogic.utils.classloaders.CodeGenClassFinder.getClassSource(CodeGenClassFinder.java:25) 位于weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:291) -消除(weblogic.utils.classloaders.ChangeAwareClassLoader) 在weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270) 在weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64) 在weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:49) -锁定(weblogic.utils.classloaders.ChangeAwareClassLoader) 位于javax.xml.datatype.FactoryFinder.getProviderClass(FactoryFinder.java:115) 位于javax.xml.datatype.FactoryFinder.newInstance(FactoryFinder.java:181) 对不起,我应该早点把它寄出去

几乎所有的线程都被包含这段代码的两行代码中的一行阻塞:

DatatypeFactory.newInstance().newXMLGregorianCalendar(dateDebCre)

显然Weblogic正在一次又一次地努力加载同一个jar。我不明白,因为它应该存储在内存中的缓存中,对吗

首先,我们将删除这些代码行,因为它们完全没有用处(很遗憾)。但是,我认为理解这个问题会更好


谢谢

首先,您需要找出谁持有锁。如果可能,请附加完整的线程转储,以便我可以查看。

从线程转储中,看起来源代码正在尝试从zip文件读取数据。如果文件太大,则可能会导致潜在问题 如果您在linux上运行,那么如果进程正在执行大量IO操作,则可以签入/var/proc目录