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

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

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

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

解决方案:

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

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

    • 为您的数据找到更高效的内存表示
    • 更改算法,使数据不需要同时存储在内存中
    • 或者。。。只要有耐心

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

相反,我怀疑这是问题的核心。至少,我预计代码的糟糕之处是导致该应用程序而非cineback系统崩溃的原因。

最新更新