服务器上不打印异常堆栈

场景

生产环境抛异常,但不打印堆栈信息,只简单的提示java.lang.NullPointerException。

先看代码对不对:

try{
    
    
    String s=null;
    s.indexOf(4);
} catch (Exception e){
    
    
    logger.error("exception:{}",e);
}

代码是没问题的,因为本地调试可以打印堆栈信息,但在服务器上只提示空指针异常。

解决方案

问题原因:
JVM在默认启动的时候会加上OmitStackTraceInFastThrow参数,含义是当大量抛出同样的异常的后,后面的异常输出将不打印堆栈。原因是打印堆栈的时候底层会调用到Throwable.getOurStackTrace()方法,而这个方法是synchronized的,对性能有比较明显的影响。所以这个参数设置是合理的。

OmitStackTraceInFastThrow 表示 快速抛异常时是否忽略堆栈。
+表示是
-表示否

-XX:+OmitStackTraceInFastThrow
服务器默认(+),忽略堆栈,不打印。


-XX:-OmitStackTraceInFastThrow
如果要打印,设置为(-),不忽略堆栈,打印。

利弊自己权衡吧,不忽略堆栈性能高一些(服务器默认)。
忽略堆栈不好定位问题。

猜你喜欢

转载自blog.csdn.net/enthan809882/article/details/113570817