参考
问题现象
线上的异常有两种,一种是有堆栈信息,比如:
java.lang.ArrayIndexOutOfBoundsException: -1
... 省略堆栈信息
另外一种,只有异常,没有对应的堆栈信息
java.lang.ArrayIndexOutOfBoundsException: null
Fast throw
当一些异常类型(空指针、下标越界、算术运算等…)在代码里的固定位置被抛出多次,虚拟机(HotSpot VM)会直接 抛出一个事先分配好、类型匹配的异常对象。此异常对象的 message 和 stack trace 都为空。
问题产生的原因就是某一个异常在同一个地方多次被抛出,JVM 抛出一个预分配异常,message、stack trace 相当于被吞掉了。
解决
出现这种优化方案的原因是 为了提高性能。当同一种异常在相同的位置被抛出多次,编译器就会重新编译此方法。重编译后,编译器可能会 使用不提供堆栈跟踪的预分配异常 来选择更快的策略。
如果想要关闭这种预分配异常的机制,可以使用 -XX:-OmitStackTraceInFastThrow。https://sourl.cn/PMzVkC