gpt4 book ai didi

Java - 避免重复的手动垃圾收集 - mstor 和 javaxmail OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-01 19:03:42 24 4
gpt4 key购买 nike

我正在使用 mstor 库来解析 mbox 邮件文件。有些文件的大小超过千兆字节。正如您可以想象的,这可能会导致一些堆空间问题。

有一个循环,每次迭代都会检索特定的消息。 getMessage() 调用尝试在堆空间耗尽时分配堆空间。如果我在此循环的顶部添加对 System.gc() 的调用,则程序会毫无错误地解析大文件,但我意识到收集垃圾 40,000 次必然会减慢程序的速度。

我的第一次尝试是使调用看起来像 if (i % 500 == 0) System.gc() 以使调用每 500 条记录发生一次。我尝试提高和降低这个数字,但结果不一致,并且通常返回 OutOfMemory 错误。

我的第二次更聪明的尝试如下所示:

try {
message = inbox.getMessage(i);
} catch (OutOfMemoryError e) {
if (firstTry) {
i--;
firstTry = false;
} else {
firstTry = true;
System.out.println("Message " + i + " skipped.");
}
System.gc();
continue;
}

这个想法是仅在抛出 OutOfMemory 错误时才调用垃圾收集器,然后递减计数以重试。不幸的是,在解析了数千封电子邮件后,程序才开始输出:

 Message 7030 skipped.
Message 7031 skipped.
....

其余的以此类推。

我只是对每次迭代的收集器如何返回与此不同的结果感到困惑。根据我的理解,垃圾就是垃圾,所有这一切应该改变的是在给定时间收集了多少垃圾。

谁能解释一下这种奇怪的行为吗?有人建议使用其他方法来减少调用收集器的频率吗?我的堆空间已满。

最佳答案

您不应依赖 System.gc(),因为它可能会被 VM 忽略。如果出现 OutOfMemory,则意味着 VM 已尝试运行 GC。您可以尝试增加堆大小,更改堆中各代的大小(假设您的大多数对象最终都在老一代中,那么年轻代不需要太多内存),检查您的代码以确保您没有持有任何引用获取您不需要的资源。

关于Java - 避免重复的手动垃圾收集 - mstor 和 javaxmail OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11142989/

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