Java 1.7/1.8 JIT编译器损坏?
我对GlazedList 1.8中的一些代码有一个问题,在java 1.8_05/64位/FC20和Windows 8下运行时,这些代码会导致SIGSEGV 我有反汇编的输出(Java 1.7/1.8 JIT编译器损坏?,java,jvm,fatal-error,jit,Java,Jvm,Fatal Error,Jit,我对GlazedList 1.8中的一些代码有一个问题,在java 1.8_05/64位/FC20和Windows 8下运行时,这些代码会导致SIGSEGV 我有反汇编的输出(-XX:+UnlockDiagnosticVMOptions'-XX:CompileCommand=print,*BoyerMooreCaseSensitiveTextSearchStrategy.indexOf'见下文),但我不知道如何调试它 因此,任何有关调试代码的帮助或向何处寻求帮助的提示都是非常感谢的 反汇编代码超
-XX:+UnlockDiagnosticVMOptions'-XX:CompileCommand=print,*BoyerMooreCaseSensitiveTextSearchStrategy.indexOf'
见下文),但我不知道如何调试它
因此,任何有关调试代码的帮助或向何处寻求帮助的提示都是非常感谢的
反汇编代码超过30000个字符。很长时间,所以你必须到这里来阅读代码
Java运行时环境检测到一个致命错误:
SIGSEGV (0xb) at pc=0x00007fdc2d93bcfc, pid=12092, tid=140582414018304
JRE版本:Java(TM)SE运行时环境(8.0_05-b13)(构建
1.8.0_05-b13)Java虚拟机:Java热点(TM)64位服务器虚拟机(25.5-b02混合模式linux-amd64压缩oops)
有问题的框架:
J 12756 C2
GlazedList.impl.filter.BoyerMooreCaseSensitiveExtSearchStrategy.indexOf(Ljava/lang/String;)I
(147字节)@0x00007fdc2d93bcfc[0x00007fdc2d93baa0+0x25c]
这确实是一个JIT编译器错误。我已经验证了它存在于JDK7U67、8u11以及最新的JDK9源代码中。以下是简化的测试用例:
public class CharArrayCrash {
static char[] pattern0 = {0};
static char[] pattern1 = {1};
static void test(char[] array) {
if (pattern1 == null) return;
int i = 0;
int pos = 0;
char c = array[pos];
while (i >= 0 && (c == pattern0[i] || c == pattern1[i])) {
i--;
pos--;
if (pos != -1) {
c = array[pos];
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 1000000; i++) {
test(new char[1]);
}
}
}
公共类字符集{
静态字符[]模式0={0};
静态字符[]模式1={1};
静态无效测试(字符[]数组){
if(pattern1==null)返回;
int i=0;
int pos=0;
字符c=数组[pos];
而(i>=0&(c==pattern0[i]| | c==pattern1[i])){
我--;
pos--;
如果(位置!=-1){
c=数组[pos];
}
}
}
公共静态void main(字符串[]args){
对于(int i=0;i<1000000;i++){
测试(新字符[1]);
}
}
}
在数组偏移量非法(0xffffffff)的数组访问指令上发生崩溃。JIT似乎错误地重新排列减量和数组加载指令
不管怎样,我已经向Oracle提交了错误报告:您是否尝试过禁用JIT编译器来处理前面关于该问题的评论中提到的特定类?jre 1.7_21似乎也报告了这个问题,因此您关于1.8 JIT编译器被破坏的问题似乎具有误导性。这似乎是一个长期存在的问题。是的,禁用JIT编译可以消除这个问题。问题也出现在1.7.x中。您是否搜索了bug数据库/向Oracle报告了它?