gpt4 book ai didi

java - 为什么我会出现 OutOfMemory 异常?

转载 作者:行者123 更新时间:2023-12-02 08:00:52 24 4
gpt4 key购买 nike

我遇到内存不足异常。为什么?我正在使用此代码进行日志记录。这种做法正确吗?异常和流的关闭在父方法中处理。

private static void writeToFile(File file, FileWriter out, String message) throws IOException {
if (file.exists() && file.isFile()) {
if ((file.length() + message.getBytes().length) <= FILE_MAX_SIZE_B) {
out.write(message);
} else {
int cutLenght = (int) (file.length() + message.getBytes().length - FILE_MAX_SIZE_B);

FileInputStream fileInputStream = new FileInputStream(file);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
char[] buf = new char[1024];
int numRead = 0;
StringBuffer text = new StringBuffer(1000);
while ((numRead=bufferedReader.read(buf)) != -1) {
text.append(buf,0,numRead);
}
String result = new String(text).substring(cutLenght);
result += message;
FileWriter fileWriter = new FileWriter(file, appendToFile);
writeToFile(file, fileWriter, result);
bufferedReader.close();
}
}
}

编辑:

我正在使用这种方法将日志写入文件。例如,在一秒钟内我可以调用 10 个日志。我在行中遇到错误:

while ((numRead=bufferedReader.read(buf)) != -1) {
text.append(buf,0,numRead);
}

最佳答案

我的猜测是,您收到了 OutOfMemoryError 错误,因为一旦日志文件太接近其最大大小,您就会将日志文件的全部内容读回到内存中。

您可以以较小的 block 读取和写入它,但这可能很棘手,因为您必须避免覆盖您尚未读取的内容。

总的来说,这种技术似乎是一种非常低效的维护日志数据的方法。我想到了一些替代方法:

(1) 维护一组 n 个日志文件,每个日志文件的最大大小为 FILE_MAX_SIZE_B/n。当第一个日志写满时,打开下一个进行写入,以此类推;当最后一个填满时,返回到第一个。通过这种方式,您每次切换文件时都会丢弃一些最旧的日志数据,但不是全部,并且仍然保持总体大小限制。

(2) 在单个文件中旋转数据。每次写入后,添加一个标记来指示这是日志流的结尾。当文件达到最大大小时,只需从头开始,覆盖那里的数据。标记会告诉您最新消息在哪里。

关于java - 为什么我会出现 OutOfMemory 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8926777/

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