背景:
生产环境抛异常,但却没有将堆栈信息输出到日志,只有简单的java.lang.NullPointerException错误信息。
原因分析
JVM在默认启动的时候会加上OmitStackTraceInFastThrow参数,含义是当大量抛出同样的异常的后,后面的异常输出将不打印堆栈。原因是打印堆栈的时候底层会调用到Throwable.getOurStackTrace()方法,而这个方法是synchronized的,对性能有比较明显对影响。所以这个参数设置是合理的。正常情况下,如果打印了几万条异常堆栈是很容易发现问题的。
现象复现
public static void main(String[] args) {
String test = null;
int i = 0;
while (true) {
try {
test.length();
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.执行优化选项
不需要对jvm参数进行设置,因为默认就是-XX:+OmitStackTraceInFastThrow这么配置的
2.取消jvm的优化
在测试启动类里面配置上jvm的参数,去掉优化,如下图
解决办法
JVM启动参数加上-XX:-OmitStackTraceInFastThrow,意思就是去掉堆栈打印的优化选项,如果想加上就把OmitStackTraceInFastThrow前面的“-”号改为“+”即可。
原文链接:https://blog.csdn.net/tengdazhang770960436/article/details/91838820
标签:java,打印,OmitStackTraceInFastThrow,jvm,堆栈,异常 From: https://www.cnblogs.com/xudong5273/p/17469499.html