CompilerThread上的JVM崩溃

时间:2011-01-16 13:22:58

标签: java crash jvm jvm-hotspot

我尝试使用SIGSEGV尝试编译特定方法(它总是使用相同的方法)时,我的java应用程序几乎一直崩溃:

 A fatal error has been detected by the Java Runtime Environment:

  SIGSEGV (0xb) at pc=0x00002aaaab6642a5, pid=8348, tid=1087596864

 JRE version: 6.0_16-b01
 Java VM: Java HotSpot(TM) 64-Bit Server VM (14.2-b01 mixed mode linux-amd64 )
 Problematic frame:
 V  [libjvm.so+0x5332a5]

 An error report file with more information is saved as:
 hs_err_pid8348.log

 If you would like to submit a bug report, please visit:
   http://java.sun.com/webapps/bugreport/crash.jsp

崩溃日志(有趣的部分......):

 A fatal error has been detected by the Java Runtime Environment:

  SIGSEGV (0xb) at pc=0x00002aaaab6642a5, pid=8348, tid=1087596864

 JRE version: 6.0_16-b01
 Java VM: Java HotSpot(TM) 64-Bit Server VM (14.2-b01 mixed mode linux-amd64 )
 Problematic frame:
 V  [libjvm.so+0x5332a5]

 If you would like to submit a bug report, please visit:
   http://java.sun.com/webapps/bugreport/crash.jsp

---------------  T H R E A D  ---------------

Current thread (0x00002aab1f7ac800):  JavaThread "CompilerThread0" daemon [_thread_in_native, id=8694, stack(0x0000000040c36000,0x00000000
40d37000)]

我试图创建一个核心转储并连接到它,但我找不到那里的CompilerThread(也许它被杀了

4 个答案:

答案 0 :(得分:2)

将整个页面(带有关于库的额外信息)与堆栈一起发布,如果能得到更多的话。如果看到核心转储,则无法看到任何线程。

如果问题包括zlib(ZipEntry),那么你就是运气不好... 在zlip中这是一个非常烦人的 BUG ,非常非常大胆,如果在打开后更改了zip(jar),就会出现这种情况。我仍然想知道为什么Sun / Oracle使用本机库进行zip处理,因为在纯Java中执行它更稳定,并且...性能明智得快2倍。

答案 1 :(得分:1)

手动优化所涉及的方法。

Current thread (0x00002aab1f7ac800): JavaThread "CompilerThread0" daemon [_thread_in_native, id=8694, stack(0x0000000040c36000,0x00000000 40d37000)]

在这一行的下方,你应该看到热点引擎试图优化的具体方法。您可能在热点中遇到了一些有问题的代码。要确切地确定哪些代码被命中以及为什么会很难确定。

我遇到了这个问题,我解决了。所涉及的方法是以非优化的方式编写的。创建了不必要的数据结构,添加了额外的循环,还创建了仅使用一次的额外变量。我迭代地优化了越来越多的这个方法,直到它最终没有在最后的迭代之后抛出异常,这是非常低级的几乎挑剔的优化。

我相信最终,在热点引擎中触发了某种字节码优化例程的错误。几乎无法确切知道发生了什么。但我认为通过手动优化代码,我优化了字节码,使热点引擎不再运行错误例程。

我知道这不是明确的,但我希望我的故事可以帮助你和未来的访客。祝你好运!

答案 2 :(得分:0)

JRE版本6.0_16相当陈旧。我建议升级到当前的JRE,这个崩溃的可能性很大。

答案 3 :(得分:0)

如果这是一个选项,则可以通过将此参数添加到java可执行调用来排除导致运行时崩溃的方法 -XX:CompileCommand=exclude,com/path/to/class/in/Jar$InnerClassIfAny.methodName

可以在

正上方的崩溃报告(hs_err_pidxxxx.log)中找到导致崩溃的类和方法的名称

--------------- P R O C E S S ---------------

标记。

注意:在Unix环境中,内部类(如果有)应该像\$而不是$一样进行转义。