Java weblogic类加载器中的线程卡住
我们遇到的情况是,weblogic(10.3.6)管理的服务器中有100多个线程 我正在分析一个线程转储,发现150个线程被阻塞,等待类加载器中的锁,如: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.
“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目录