gpt4 book ai didi

java - 内存不足错误,java堆空间

转载 作者:搜寻专家 更新时间:2023-10-31 08:09:01 25 4
gpt4 key购买 nike

我尝试读取超过 400 万行且大小超过 400 MB 的日志文件,但出现内存不足错误:java 堆空间。这是我的代码:

File file = new File("C:\\file.log");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
StringBuilder stringBuffer = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line);
}

我尝试将堆内存增加到 1GB,但仍然收到该消息。可能的原因是什么?

最佳答案

好的,阅读您收到的评论,您应该已经有了线索。

问题说明:

您的日志文件大小为 400MB。请注意,这是以字节为单位测量的。现在您正在使用 line = bufferedReader.readLine() 逐行读取它,从而将一些字节转换为字符串。

Java 中的 String 实例内部包含一个 char[]。但是 Java 中的 char 需要 2 个字节!所以你需要至少 800MB 的堆空间来存储所有的字符。由于您还分配了其他几个对象,并且 JVM 本身需要一些内存,因此 1 GB 很可能不够。

此外,StringBuffer(顺便说一下:最好使用 StringBuilder)在内部再次使用一个 char[],它被扩展(长度)在需要时自动。这种扩展是通过将长度加倍来完成的。因此,对于一个 400MB 的文件,它有一个长度为 512M 的 char[]。还是提醒一下:一个char占2个字节。

那么解决方案是什么?简单地说:不要将整个文件读入内存!

改为这样做:

class LogAnalyzer {
private final File logFile;

LogAnalyzer(File logFile) {
this.logFile = logFile;
}

void analyze() throws IOException {
try(FileReader fileReader = new FileReader(logFile)) {
try(BufferedReader bufferedReader = new BufferedReader(fileReader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
analyzeLine(line);
}
}
}
}

private void analyzeLine(String line) {
// do whatever you need here
}
}

如果你需要保留一些行,你应该将它们存储在 LogAnalyzer 的一些实例字段中,和/或让这个类表现得像一个状态机。

关于java - 内存不足错误,java堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20626652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com