情况:系统抛出异常,日志没有打印堆栈信息 错误日志正常打印
分析:异常信息打印格式没有错误,本地测试没有问题,线上其他环境也没有类似的情况。 可能是jvm禁掉了某些
东西,导致了异常信息没有打印出来
资料:https://stackoverflow.com/questions/2295015/log4j-not-printing-the-stacktrace-for-exceptions
https://www.oracle.com/technetwork/java/javase/relnotes-139183.html
虚拟机部分
The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.
译文:服务器VM中的编译器现在为所有“冷”内置异常提供正确的堆栈回溯。出于性能目的,当抛出这样的异常几次时,可以重新编译该方法。重新编译之后,编译器可以使用不提供堆栈跟踪的预分配异常来选择更快的策略。要完全禁用预分配的异常,请使用以下新标志: -XX:-OmitStackTraceInFastThrow。
结论:虚拟机打印堆栈超过一定次数以后,会关闭掉异常堆栈的打印,通过-XX:-OmitStackTraceInFastThrow
参数可禁用 掉该优化
网友评论