我试图测试Math.pow()与“手动”乘法的速度,并偶然发现这个错误:
A fatal error has been detected by the Java Runtime Environment:
EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000005ac46888, pid=1508, tid=6016
JRE version: Java(TM) SE Runtime Environment (8.0_25-b18) (build 1.8.0_25-b18)
Java VM: Java HotSpot(TM) 64-Bit Server VM (25.25-b02 mixed mode windows-amd64 compressed oops)
Problematic frame:
V [jvm.dll+0x496888]
Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
生成代码的代码:
long t = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
double val = i*i*i*i*i /* 256 times *i */ *i*i*i;
sum ^= Double.doubleToLongBits(val);
}
System.out.println((System.nanoTime() - t) / 10000000);
我得到这是真的极端的情况,但仍然,这是有效的代码,可能发生的最糟糕的事情应该是Inf的价值,而不是JRE崩溃。这是由oracle描述的真正的标准行为,或只是没有人想要修复的错误,因为如果你看到它,你真的是坏人。
对于使用NetBeans 8.0.2运行的记录
更新1
似乎问题是乘数的大小。
long t = System.nanoTime();
for(int j = 0; j < 10000000; j++) {
int i = j % 50;
double val = i*i*i*i*i /* 256 times *i */ *i*i*i;
sum ^= Double.doubleToLongBits(val);
}
System.out.println((System.nanoTime() - t) / 10000000);
将通过很好。
更新2
试图从控制台运行它
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
并且传递得很好,所以我认为它必须是这个特定的JRE或NetBeans的问题。