当前位置: 首页 > 知识库问答 >
问题:

Java JRE致命错误:乘法太多

纪辰沛
2023-03-14

我试图测试Math.pow()的速度,反对“手动”乘法,并偶然发现了这个错误:

Java 运行时环境检测到致命错误:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) 在 pc=0x000000005ac46888, pid=1508, tid=6016

JRE版本:Java(TM)SE运行时环境(8.0_25-b18)(构建1.8.0-25-B16)
Java VM:Java热点(TM)64位服务器VM(25.25-b02混合模式windows-amd64压缩oops)
问题帧:
V[jvm.dll 0x496888]

无法写入核心转储。默认情况下,在客户端版本的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崩溃。这真的是甲骨文描述的标准行为吗?还是只是一个没人想修复的bug,因为如果你看到了它,你真的是个坏人。

对于记录运行 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的问题。

共有3个答案

干稳
2023-03-14

尝试使用BigInteger。

import java.math.BigInteger;

public class hackerrank {
    public static void main (String args[]){
        BigInteger x = new BigInteger("10000000");
        BigInteger sum = BigInteger.ZERO;
        long t = System.nanoTime();
        for (BigInteger i = BigInteger.ONE; i.compareTo(x) == -1; i = i.add(BigInteger.ONE)) {
            BigInteger j = i.remainder(new BigInteger("50"));
            BigInteger val = j.pow(256);
            sum = sum.xor(val);
        }
        System.out.println((System.nanoTime() - t) / 10000000);
    }
}

输出:4083

楚望
2023-03-14

这对我来说很好。您的问题发生在哪里?通过减少乘法或循环数来隔离问题。它适用于50乘法吗?

long sum=0;
long t = System.nanoTime();
for (int i = 1; i < 10000000; i++) {
    double val = i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i
                    *i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i
                    *i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i; 
            // set of 10 *i*i*i*i*i*i*i*i*i*i
    sum ^= Double.doubleToLongBits(val);
}
System.out.println(sum);
System.out.println((System.nanoTime() - t) / 10000000);

jre1.8.0_51

输出:

    -32067153335156736
    614

即使再乘以10次迭代也可以,但真的很慢。时间6020

禹正阳
2023-03-14

在我看来,这绝对像是一个JVM错误。这比SO上的问题更适合作为bug报告。参见http://bugreport.java.com/

 类似资料:
  • 我知道有一些与此相关的问题,但是有c或其他语言。我得到了这个错误,我不确定我的功能出了什么问题。这是我的错误 致命错误:Uncaught ArgumentCounter错误:函数Admincategory::deletecategory()的参数太少,在F:\xampp\htdocs\digikalamvc\core\app中传递了0。php位于第34行,在F:\xampp\htdocs\digi

  • 我正在努力将mysql_results替换为mysqli。有人能帮忙吗。我所需要的只是在下面的代码中更正'mysqli_result($result,'0','theurl')'。当所有东西都使用mysql函数编写时,它就起作用了。但是在我将所有内容转换为mysqli之后,mysql_results转换似乎不起作用了。 当它工作时:echo(mysql_num_rows($query)!==0)?

  • 我得到以下错误: 警告:require_once(D:/xampp/htdocs/inc/head.php):无法打开流:第3行的D:\xampp\htdocs\ecommerce1\index.php中没有此类文件或目录 致命错误:require_once():无法打开required'D:/xampp/htdocs/inc/head。D:\xampp\htdocs\ecommerce1\ind

  • 我已经用JDK在我的SOLARIS SPRAC机器上更新了4个月,回到了1.6.045,直到昨天它运行得很好,没有任何问题,但昨天不幸的是,我遇到了如下致命错误,实例崩溃,作为解决方法,我重新启动了我的服务器实例,它现在运行良好。 我需要知道, 这个错误的确切根本原因是什么 Java运行时环境检测到一个致命错误: pc=0xfebd390c时的SIGSEGV(0xb),pid=2626,tid=3

  • 致命错误:未捕获的错误:调用/home/prasanth/projects/ishen1/index中的未定义函数mysqli_result()引发了堆栈跟踪:#0{main}