首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >挂起的线程数java.lang.ClassLoader.findBootstrapClass

挂起的线程数java.lang.ClassLoader.findBootstrapClass
EN

Stack Overflow用户
提问于 2011-01-19 18:28:46
回答 3查看 3.5K关注 0票数 3

我的J2EE应用程序执行速度很慢。在这种情况下,我们使用了Thead转储,发现下面的线程可以在多个转储中运行,并在一些监视器上获取了锁,这会导致其他线程(直接或间接)等待这些锁。

代码语言:javascript
复制
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) 
.....

你能建议哪些线程没有移动,而让其他线程工作吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-25 09:28:32

为什么你的应用要加载这么多类(锁在loadClass中)?预计您的应用程序仅在初始化和预热期间加载卸载的类。

因此,我怀疑以下情况之一正在发生:

  • 您正在创建大量不同的动态代理类,而不是尝试重用它们。
  • 您正在创建大量不必要的ClassLoaders,或者至少是滥用它们。
  • 您正在启动和终止多个并行JVM。

不用说,这些东西都是非常昂贵的,应该尽量避免。

票数 1
EN

Stack Overflow用户

发布于 2011-01-27 00:31:17

如果这个线程被无限期地暂停,我会猜测它是某种循环引用(符号链接?其他?)。

如果您为加载的类启用日志记录,您可能会发现更多信息。

代码语言:javascript
复制
java -verbose:class your.Class

这可能会向您显示很多信息;我相信它会写入system.out,所以您必须检查相应的日志。

票数 1
EN

Stack Overflow用户

发布于 2011-01-27 01:35:34

我在OSGI中见过这样的事情,它的类加载器结构是一个图形,而不是像通常的J2EE那样是一个树。类加载器在加载类时会锁定自身,因此两个线程(a,b)分别以(x,y)和(y,x)的顺序从类加载器加载类可能会死锁。如果静态初始化器导致从其他类加载器加载更多的类,则可能会发生这种情况。bootstrap类导致从应用程序类加载器加载类的情况并不常见,但标准库中使用线程上下文加载器的任何工厂类都可以满足要求。通常的解决方案是在较早的时间加载类,可能是在应用程序启动期间,这样就打破了循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4734158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档