2

尝试使用 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

4 回答 4

2

将整个页面(带有库上的额外信息)与堆栈一起发布,如果可以获得更多信息。如果您看到核心转储,您将看不到任何线程。

如果问题包括zlib(ZipEntry),那么您很不走运......这是zlip中非常烦人的BUG,非常大胆,如果zip(jar)在打开后发生更改,就会发生这种情况。我仍然想知道为什么 Sun/Oracle 使用本机库进行 zip 处理,因为在纯 java 中执行它更稳定并且......快 2 倍(性能方面)。

于 2011-01-16T15:12:14.303 回答
1

手动优化所涉及的方法。

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

在这条线下方,您应该看到热点引擎试图优化的具体方法。您可能在热点中遇到了一些有问题的代码。很难确定究竟是什么代码被击中以及为什么。

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

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

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

于 2012-06-11T13:38:52.563 回答
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 环境中,内部类(如果有)应该像这样转义,\$而不是$.

于 2011-07-28T12:38:22.233 回答
0

JRE 版本 6.0_16 相当旧。我建议升级到当前的 JRE,这个崩溃很有可能已经得到修复。

于 2011-01-16T13:47:39.323 回答