Java 1.7/1.8 JIT 编译器坏了?

标签 java jvm fatal-error jit

在 java 1.8_05/64 位/FC20 和 Windows 8 下运行时,GlazedList 1.8 中的一些代码会导致 SIGSEGV 出现问题。

我有反汇编输出(-XX:+UnlockDiagnosticVMOptions '-XX:CompileCommand=print,*BoyerMooreCaseInsensitiveTextSearchStrategy.indexOf' 见下文)但我不知道如何调试它。

因此,对于调试代码或向何处寻求帮助的提示,我们将不胜感激。

反汇编代码超过30000个字符。很长,所以你必须去这里https://java.net/jira/browse/GLAZEDLISTS-564?focusedCommentId=378982&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-378982阅读代码

Java 运行时环境检测到 fatal error :

SIGSEGV (0xb) at pc=0x00007fdc2d93bcfc, pid=12092, tid=140582414018304

JRE version: Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05-b13) Java VM: Java HotSpot(TM) 64-Bit Server VM (25.5-b02 mixed mode linux-amd64 compressed oops)

Problematic frame:

J 12756 C2

ca.odell.glazedlists.impl.filter.BoyerMooreCaseInsensitiveTextSearchStrategy.indexOf(Ljava/lang/String;)I (147 bytes) @ 0x00007fdc2d93bcfc [0x00007fdc2d93baa0+0x25c]

最佳答案

这确实是一个 JIT 编译器错误。我已经验证它存在于 JDK 7u67、8u11 以及最新的 JDK 9 源代码中。这是简化的测试用例:

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]);
        }
    }
}

崩溃发生在数组偏移量非法(0xffffffff)的数组访问指令上。
似乎 JIT 错误地重新排序了递减和数组加载指令。

无论如何,我已将错误报告提交给 Oracle:https://bugs.openjdk.java.net/browse/JDK-8054478

关于Java 1.7/1.8 JIT 编译器坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25160220/

相关文章:

java - 如何遍历大目录的目录树并忽略文件

java - Android自定义 View 中的可变大小

java - 编码中线程 "main"java.lang.NullPointerException 异常

java - jdk 中不存在 MonitoredHost 类

java - JVMVRFY012 堆栈形状不一致;类=com/sun/xml/messaging/saaj/soap/SOAPDocumentImpl

java - JIT如何调度字节码的执行?

C++ VS fatal error C1083 权限被拒绝

java - JDialog标题的字体大小

objective-c - 混合 Objective-C 和 Swift : fatal error: use of unimplemented initializer 'init(target:action:)' for class

PHP:异常和可捕获的 fatal error 有什么区别?