有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jvm Java 1.7/1.8 JIT编译器损坏?

我对GlazedList 1.8中的一些代码有一个问题,在java 1.8_05/64位/FC20&;下运行时,这些代码会导致SIGSEGV;视窗8

我有反汇编的输出(-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运行时环境检测到一个致命错误:

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]


共 (1) 个答案

  1. # 1 楼答案

    这确实是一个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]);
            }
        }
    }
    

    当数组偏移量非法(0xFFFFFF)时,在数组访问指令上发生崩溃
    JIT似乎错误地重新排列减量和数组加载指令

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