我正在使用 Java,并且使用 sl4j/log4j 进行日志记录。只是出于好奇,我想知道写太多日志是否会导致Java OutOfMemory错误?
什么太多了?嗯,说 10 分钟内 100 mb 的登录,同时进行过多的数据库操作(我知道这个信息不足以给出一个精确的答案,但即使我不是在寻找一个精确的答案,只是想知道一般情况下可以这样情况永远到来)。
此外,我的日志记录过程不是异步的。
您收到堆已用尽的错误,对吗?不是 PermGen 错误?
显然日志库没有泄漏,但毫无疑问,如果您编写了一些在很短的时间内创建了大量字符串的代码,您可能会耗尽内存。您会认为这会导致 permgen 错误,因为很难想象您的日志记录对象足以解雇堆。
过多的数据库操作是典型的 OOME 罪魁祸首:特别是返回大型结果集。我不会称之为内存泄漏。长时间运行后,泄漏通常会导致故障。如果您有一个包含一百万条记录和 20 列的表,并尝试在查询中返回它,那么它将一直运行到堆消失并崩溃,第一次,没有泄漏或引用问题。
我想知道写太多日志是否会导致Java OutOfMemory错误?
我非常怀疑。
如果您遇到 OOME 问题,最可能的原因是内存泄漏。您应该有条不紊地进行调查,而不是(基本上)猜测可能的原因。
(如果内存泄漏发生在某个日志库中,那将是库中的错误。这并非不可能,但很可能很久以前就已经发现并修复了这样的错误。)