这几天线上一直有npe异常的告警,通过查日志发现,报错信息为:
java.lang.NullPointerException: null
没有堆栈信息,估计是哪个对象为空,然后调用该对象的getxxx方法时,抛出异常。
本地试了一下,重现了该问题,后面只是打印了异常名称。
原因分析
JVM 虚拟机会对异常信息进行优化,当相同异常出现很多次,会认为它是热点异常,忽略掉异常堆栈信息;通过增加 JVM 参数:-XX:-OmitStackTraceInFastThrow 可解决。
解决:
在JVM启动参数中增加:-XX:-OmitStackTraceInFastThrow后,异常就能正常输出。
深入了解:
加上该参数是否会影响线上服务器的性能?
肯定会,需要综合分析再使用。
该参数只会对以下异常做日志优化:
NullPointerException
ArithmeticException
ArrayIndexOutOfBoundsException
ArrayStoreException
ClassCastException