在我们的一个客户安装中,我们遇到了数千次相同的异常。在大量记录良好的堆栈跟踪(9332)之后,仍然记录了异常的发生,但没有堆栈跟踪。重新启动 java 进程后,同样的事情:这次我们有 17858 个堆栈跟踪,然后只有异常发生本身。
这里有一个类似的问题,但没有答案......
它是 log4j 功能还是错误?(我相信前者,因为我真的很喜欢那些 apache 家伙所做的)
有任何想法吗?
在我们的一个客户安装中,我们遇到了数千次相同的异常。在大量记录良好的堆栈跟踪(9332)之后,仍然记录了异常的发生,但没有堆栈跟踪。重新启动 java 进程后,同样的事情:这次我们有 17858 个堆栈跟踪,然后只有异常发生本身。
这里有一个类似的问题,但没有答案......
它是 log4j 功能还是错误?(我相信前者,因为我真的很喜欢那些 apache 家伙所做的)
有任何想法吗?
使用 Java 5 或更好?
然后你会看到:
服务器 VM 中的编译器现在为所有“冷”内置异常提供正确的堆栈回溯。出于性能目的,当此类异常被抛出几次时,可能会重新编译该方法。重新编译后,编译器可能会使用不提供堆栈跟踪的预分配异常来选择更快的策略。要完全禁用预分配异常,请使用这个新标志:
-XX:-OmitStackTraceInFastThrow
由Java 5 发行说明提供。
对我来说听起来像是一个特性,至少如果堆栈跟踪确实是相同的。为什么要在不获取更多信息的情况下使日志更大(因此更难搜索)?将检查此功能的可配置性...
编辑:我查看了 log4j 代码,没有任何痕迹。这强烈表明罗伯特的答案是正确的。不错的 VM 功能 IMO :)