[英]Hung Threads java.lang.ClassLoader.findBootstrapClass
我的J2EE应用程序运行缓慢。 我们在那种情况下采用了Thead Dumps,发现以下线程在多个转储中是Runnable,并且在某些监视器上锁定了导致其他线程(直接或间接)等待锁定。
at java.lang.ClassLoader.findBootstrapClass(Native Method)
at java.lang.ClassLoader.findBootstrapClass0(ClassLoader.java:891)
at java.lang.ClassLoader.loadClass(ClassLoader.java:301)
- locked [0x9747c360] (a sun.misc.Launcher$ExtClassLoader)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
- locked [0x9747c318] (a sun.misc.Launcher$AppClassLoader)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
- locked [0x9747c318] (a sun.misc.Launcher$AppClassLoader)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
.....
你能否建议一下这个线程没有移动,让其他线程工作?
为什么你的应用程序加载了这么多类(锁在loadClass中)? 您的应用程序应该在初始化和预热期间加载卸载的类。
所以,我怀疑发生了以下事情之一:
不用说,任何这些东西都非常昂贵,应该尽可能避免。
如果这个线程无限期地暂停,我猜它是某种循环引用(符号链接?其他?)。
如果为已加载的类启用日志记录,则可能能够了解更多信息。
java -verbose:class your.Class
这可能会告诉你很多; 我相信它写入system.out所以你必须检查相应的日志。
我已经在OSGI中看到过这种事情,其中类加载器结构是图形而不是通常的J2EE树。 类加载器在加载类时会自行锁定,因此两个线程(a,b)分别按(x,y)和(y,x)的顺序从类加载器加载类可能会死锁。 如果静态初始化程序导致更多来自其他类加载器的类加载,则可能发生这种情况。 引导类从应用程序类加载器导致类加载的频率并不高,但使用线程上下文加载器的标准库中的任何工厂类都符合要求。 通常的解决方案是在应用程序启动期间更早地加载类,从而打破循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.