java.lang.Class.getEnclosingMethod0(本机方法)中有很多RUNNABLE线程

时间:2012-07-25 14:50:42

标签: java jvm

我一直在使用我们系统的线程转储来解决各种问题,我注意到的一件事是,在好的时候和坏的时候,我们在线程转储中有很多这样的事情:

"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线程转储中)?

1 个答案:

答案 0 :(得分:0)

今天我们遇到了无限循环的问题。在对问题进行故障排除时,我们发现通常情况下,线程堆栈以此方法调用结束。

当我们发现问题时,它与getEnclosingMethod0无关,而是在更高级别上的无限循环。即使在循环中做了一些相当昂贵的事情,似乎getEnclosingMethod0调用是迄今为止最慢的事情。

我的结论是getEnclosingMethod0偶尔会很慢,即使它没有阻塞(在我们的案例AFAIK中没有这样做)。