超频 cpu 导致 JRE 出现致命错误

Over clocking cpu causes a fatal error in the JRE

我正在尝试读取非常大的文本文件(100 gig 点云文件),我的 eclipse 程序可以很好地读取它们,但是需要一段时间。我对 cpu 进行了超频,现在我收到了这条致命错误消息。它声称“无法写入核心转储。默认情况下,Windows 的客户端版本未启用小型转储”,但我尝试启用它们,但我仍然收到消息。有任何想法吗?这是我的文件 reader class 我知道它的代码有问题,但我怀疑这就是问题所在。

public class text_file_reader {

    private volatile String[] data= new String[100000000];
    private volatile int count =0;
    public text_file_reader (String filename) {


        try {

            String line = null;
            FileReader fileReader = new FileReader(filename);
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            int i=0;

            while((line = bufferedReader.readLine()) != null) {
                data [i] = bufferedReader.readLine();
                count++;
                i++;
            }   

            bufferedReader.close();         
        }
        catch(FileNotFoundException ex) {
            System.out.println( "Unable to open file '" + filename + "'");                
        }
        catch(IOException ex) {
            System.out.println("Error reading file '" + filename + "'");                  
        }
    }

    public String[] getData() {
        return data;
    }

    public int getCount() {
        return count;
    }
}

好吧,您的程序似乎正在尝试读取内存中的一个非常大的文件并将其缓冲为一个巨大的字符串数组。

我怀疑这会产生大量垃圾。此外,由于可访问的数据量将增长到数十或数百 GB,GC 将做大量工作,并重复访问几乎整个 JVM 地址 space.

这种情况可能会给您的芯片组带来压力,尤其是当您对其进行超频时。听起来你已经把它推到了导致 OS 崩溃的硬件错误的地步。

解决方案:

  1. 不要像那样超频 CPU。它可能会使您的系统不可靠,并可能永久损坏硬件。

  2. 考虑修改您的代码,使其不需要同时在内存中保存 100,000,000 个字符串:

    • 为您的数据寻找更高效的内存表示法
    • 更改算法,使数据不需要同时全部在内存中。
    • 或者...耐心等待。

I know its bad code but I doubt that's the issue.

相反,我怀疑是问题的核心。至少,我认为代码的错误是导致此应用程序而非 cinebench 系统崩溃的原因。