我尝试使用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(也许它被杀了
答案 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环境中,内部类(如果有)应该像\$
而不是$
一样进行转义。