gpt4 book ai didi

java - 分析 native 方法上的卡住线程

转载 作者:行者123 更新时间:2023-12-02 06:07:12 25 4
gpt4 key购买 nike

我正在使用 tomcat 和 java 1.7.0_80。该产品是使用 drools 的规则引擎。加载系统后速度变慢。我进行了线程转储,看到许多线程如下所示:

http-bio-9980-exec-48" daemon prio=10 tid=0x00007fa8b43a3000 nid=0x10299             runnable [0x00007fa9522c5000]
java.lang.Thread.State: RUNNABLE
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2595)
at java.lang.Class.getConstructor0(Class.java:2895)
at java.lang.Class.newInstance(Class.java:354)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
at sun.reflect.MethodAccessorGenerator.generateMethod(MethodAccessorGenerator.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:46)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
.
.
.

我认为这些线程被卡住了,所以我做了另一个线程转储(以查看 native 方法上发生了什么):

00007faa1dabf6d5      __pthread_cond_wait + 0xc5
0x00007faa1cb638ad _ZN15JvmtiRawMonitor9raw_enterEP6Thread + 0x25d
0x00007faa1cb3f63d _ZN8JvmtiEnv15RawMonitorEnterEP15JvmtiRawMonitor + 0xad
0x00007faa1b7089a8 debugMonitorEnter + 0x38
0x00007faa1b6f5205 event_callback + 0xe5
0x00007faa1b6f5e3e cbClassPrepare + 0x8e
0x00007faa1cb548c4 _ZN11JvmtiExport18post_class_prepareEP10JavaThreadP12klassOopDesc + 0x1b4
0x00007faa1ca1de8e _ZN13instanceKlass15link_class_implE19instanceKlassHandlebP6Thread + 0x45e
0x00007faa1cae55c7 JVM_GetClassDeclaredConstructors + 0x1b7
0x00007faa180cac39 * java.lang.Class.getDeclaredConstructors0(boolean) bci:0 (Interpreted frame)

有人可以告诉我为什么这里会发生争用吗?

最佳答案

好吧,让我试着回答你。我将做出一个假设,最上面的条目是最里面的调用。

它在reflect中,调用一些方法,很难说是什么,但是需要创建一个或多个方法并运行它们,并且这需要创建一个新的 java.lang.Class 实例,并且这需要获取该类的构造函数,并且深入到 JVM 中,命中一个事件并将其放入debugMonitor,其中很可能处于线程等待中在调试器中挂起等待用户输入。

那么也许您需要查看另一个线程?或者也许这是正确的,您只需要忽略事件回调之后的级别即可。无论如何,我都会查看该reflect,看看它是否引用您的代码。这就是你需要找到的。深入研究您认为工作正常的系统代码是没有好处的。

关于java - 分析 native 方法上的卡住线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37571502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com