广泛的异常日志记录会导致java.lang.OutOfMemoryError:超出GC开销限制

时间:2014-01-10 10:49:37

标签: java logging garbage-collection out-of-memory

我的生产服务器中有java.lang.OutOfMemoryError: GC overhead limit exceeded

我在日志文件中注意到的唯一一件事是,一个方法抛出了太多的完整堆栈跟踪异常,无法找到某个id(这是业务逻辑的一部分)。

我正在使用org.slf4j进行日志记录。

所以我的问题是 - 广泛的日志记录是否会导致此问题,或者我应该关注其他一些部分来检查内存泄漏?

2 个答案:

答案 0 :(得分:1)

对于这样的事情,你需要真正的信息而不是猜测。使用分析器(Netbeans和大多数其他IDE都内置了一个),它可以准确地告诉你内存的去向。除非你的设置中有一些非常奇怪的内容,否则它的价值不太可能导致问题。无论在异常中发生什么,都可能(或可能不)连接。

答案 1 :(得分:1)

尽可能广泛地记录,只涉及短期对象,只有在极端情况下才能到达旧生成对象。另一方面,GC overhead limit exceeded错误意味着实际上所有堆都是强可达的,并且只有一小部分对象可以回收它。 GC必须努力识别这些少数对象,并且必须经常这样做。

因此,您的大量日志记录可能会为您的问题做出贡献并加剧它,但它几乎永远不会成为它的真正来源。你必须找到永久占据堆的东西。