异常正常打印堆栈丢失
现象发现异常日志文件里有很多nullPointException,只有简单的异常名称,却没有堆栈信息。(已确认代码中日志打印方式正确)
原因jit本身的优化,没有记录trace “JVM对一些特定的异常类型做了Fast Throw优化,如果检测到在代码里某个位置连续多次抛出同一类型异常的话,C2会决定用Fast Throw方式来抛出异常,而异常Trace即详细的异常栈信息会被清空。这种异常抛出速度非常快,因为不需要在堆里分配内存,也不需要构造完整的异常栈信息。”方案从最开始的同类报警进行排查,可以获取详细信息(建议)增加一个VM Options:-XX:-OmitStackTraceInFastThrow
这个参数。 支持的异常类型如下:
- NullPointerException
- ArithmeticException
- ArrayIndexOutOfBoundsException
- ArrayStoreExceptionClassCastException
参考文档
https://blog.51cto.com/u_13626762/3114735
https://zhuanlan.zhihu.com/p/235424609
This post is licensed under CC BY 4.0 by the author.