我的J2EE应用程序执行速度很慢。在这种情况下,我们使用了Thead转储,发现下面的线程可以在多个转储中运行,并在一些监视器上获取了锁,这会导致其他线程(直接或间接)等待这些锁。
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)
.....你能建议哪些线程没有移动,而让其他线程工作吗?
发布于 2011-01-25 09:28:32
为什么你的应用要加载这么多类(锁在loadClass中)?预计您的应用程序仅在初始化和预热期间加载卸载的类。
因此,我怀疑以下情况之一正在发生:
不用说,这些东西都是非常昂贵的,应该尽量避免。
发布于 2011-01-27 00:31:17
如果这个线程被无限期地暂停,我会猜测它是某种循环引用(符号链接?其他?)。
如果您为加载的类启用日志记录,您可能会发现更多信息。
java -verbose:class your.Class这可能会向您显示很多信息;我相信它会写入system.out,所以您必须检查相应的日志。
发布于 2011-01-27 01:35:34
我在OSGI中见过这样的事情,它的类加载器结构是一个图形,而不是像通常的J2EE那样是一个树。类加载器在加载类时会锁定自身,因此两个线程(a,b)分别以(x,y)和(y,x)的顺序从类加载器加载类可能会死锁。如果静态初始化器导致从其他类加载器加载更多的类,则可能会发生这种情况。bootstrap类导致从应用程序类加载器加载类的情况并不常见,但标准库中使用线程上下文加载器的任何工厂类都可以满足要求。通常的解决方案是在较早的时间加载类,可能是在应用程序启动期间,这样就打破了循环。
https://stackoverflow.com/questions/4734158
复制相似问题