java - 超频 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 地址空间。
这种情况可能会给您的芯片组带来压力,尤其是在您对其进行超频时。听起来你已经把它推到了导致操作系统崩溃的硬件错误的地步。
解决方案:
不要那样超频你的CPU。它有可能使您的系统不可靠,并可能永久损坏硬件。
考虑修改您的代码,使其不需要同时在内存中保存 100,000,000 个字符串:
- 为您的数据找到内存效率更高的表示
- 更改算法,以便数据不需要同时全部存储在内存中。
- 或者……请耐心等待。
我知道它的错误代码,但我怀疑这就是问题所在。
相反,我怀疑它是问题的核心。至少,我认为代码的错误是导致此应用程序而不是 cinebench 系统崩溃的原因。
推荐阅读
- javascript - body onload 函数在我的示例(JavaScript)中不起作用
- search - Solr 搜索没有给出单个词项的确切结果
- javascript - 如何从浏览器控制台上可见的对象获取数据,但在我的代码上手动遍历它时返回 null?
- c++ - 十六进制到十进制转换器不起作用(c ++)
- angular - 从 ngxs 商店读取
- python - 使用其他模型的属性作为默认值
- laravel - Laravel livewire 和 vuejs 无限滚动
- flutter - Flutter 中受密码保护的 AlertDialog
- python - 使用超时设置从子进程捕获输出
- docker - docker compose 启动的一些容器如何管理