解决Java JIT错误

Rog*_*Orr 3 java jit

我们似乎在Java环境中遇到了一个奇怪的错误.我们现在有两次相同的"不可能发生"的例外; 在一个案例中,问题在运行过程中的48分钟内发生了42,551次,然后自发地自行清除.

失败的代码由此行触发:

return String.format("%1d%XY%d", source, System.currentTimeMillis(), quoteID);
Run Code Online (Sandbox Code Playgroud)

在哪里int source = 0long quoteID = 44386874(例如).

例外是:

java.util.UnknownFormatConversionException: Conversion = 'd'
        at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2605)
        at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2633)
        at java.util.Formatter.parse(Formatter.java:2479)
        at java.util.Formatter.format(Formatter.java:2413)
        at java.util.Formatter.format(Formatter.java:2366)
        at java.lang.String.format(String.java:2770)
Run Code Online (Sandbox Code Playgroud)

检查代码'd'不应该引发此异常.

我们提出的最佳解释是JIT编译器生成了错误的字节码,但在随后的重新JIT中,它编写了良好的代码.

任何人都有办法解决/诊断这样的问题吗?

罗杰.

Yuv*_*dam 7

我怀疑这是一个合法的JIT问题.

您是否排除了内存损坏或运行时环境问题等其他可能性?

您是如何得出结论这是JIT问题的?

只是为了缓解你的想法,这是抛出异常的代码:

private char java.util.Formatter.FormatSpecifier.conversion(String s) {
    c = s.charAt(0);
    if (!dt) {
    if (!Conversion.isValid(c))
        throw new UnknownFormatConversionException(String.valueOf(c));

        ///////..........
}
Run Code Online (Sandbox Code Playgroud)

有:

static boolean java.util.Formatter.Conversion.isValid(char c) {
    return (isGeneral(c) || isInteger(c) || isFloat(c) || isText(c)
        || c == 't' || c == 'c');
}
Run Code Online (Sandbox Code Playgroud)

d是一个合法的整数标识符,isValid()应该返回True.

调试这不是问题,一个有根据的猜测会说你什么都找不到.这显然是内存损坏/环境问题.听起来这个问题很容易复制.尝试在不同的机器,不同的操作系统,不同的JVM上进行测试.

我的预感 - 你的问题不是JIT编译器.

  • 事实上,它是零星的,真的,非常奇怪,这是一个硬件问题.尽管可能,JIT编译器,JVM环境中的错误也不太可能发生. (2认同)