java不打印异常堆栈

发布时间 2023-06-09 16:12:14作者: xudong5273

背景:

生产环境抛异常,但却没有将堆栈信息输出到日志,只有简单的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