我一直在使用我们系统的线程转储来解决各种问题,我注意到的一件事是,在好的时候和坏的时候,我们在线程转储中有很多这样的事情:
"TP-Processor59" - Thread t@915
java.lang.Thread.State: RUNNABLE
at java.lang.Class.getEnclosingMethod0(Native Method)
at java.lang.Class.getEnclosingMethodInfo(Class.java:929)
at java.lang.Class.getEnclosingClass(Class.java:1081)
at java.lang.Class.getSimpleBinaryName(Class.java:1220)
at java.lang.Class.getSimpleName(Class.java:1112)
现在,我们对getSimpleName()进行了大量调用,这是我们的配置系统所依赖的。但我的问题是为什么他们总是被这种特殊方法所困扰?这是一个Windows JVM,1.6.0_29,64位。
我觉得getSimpleName()通常应该是一个非常快速的调用。这很可能是getEnclosingMethod0()以某种方式非常慢,或者是否有可能该本机方法以某种方式阻塞某些东西(当然,这不会出现在JVM线程转储中)?
答案 0 :(得分:0)
今天我们遇到了无限循环的问题。在对问题进行故障排除时,我们发现通常情况下,线程堆栈以此方法调用结束。
当我们发现问题时,它与getEnclosingMethod0无关,而是在更高级别上的无限循环。即使在循环中做了一些相当昂贵的事情,似乎getEnclosingMethod0调用是迄今为止最慢的事情。
我的结论是getEnclosingMethod0偶尔会很慢,即使它没有阻塞(在我们的案例AFAIK中没有这样做)。