首页 > 解决方案 > 超频 cpu 导致 JRE 中的致命错误

问题描述

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

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;
    }
}

标签: javahardware

解决方案


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

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

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

解决方案:

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

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

    • 为您的数据找到内存效率更高的表示
    • 更改算法,以便数据不需要同时全部存储在内存中。
    • 或者……请耐心等待。

我知道它的错误代码,但我怀疑这就是问题所在。

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


推荐阅读