最近线上发现很多异常没有堆栈信息,只有一句描述,如下:
java.lang.NullPointerException: null
排查问题时受到了一些阻碍。然后发现无论是在本地环境还是测试环境,堆栈信息都可以正常打印,使用的是同一份日志配置文件。
百思不得其解,遂Google之,发现一篇文章:JVM解惑:消失的异常堆栈,log中打印异常堆栈为空
验证后,果然是由于Hotspot的优化:
JIT编译器对异常进行了优化,当代码中的某个位置抛出同一个异常很多次后,
JIT服务端编译器(C2)会将其优化成抛出一个事先编译好的、类型匹配的异常,异常堆栈信息就看不到了。
豁然开朗,记录以备忘