之前同事写的一个更新数量的代码,先放入缓存,在看线程每秒轮询下,看是否有值,有的话就更新,但是在取出的对象中有空值,造成该方法一直报空指针异常,到线上后异常信息很多,但是我打印的堆栈信息却没有显示出具体哪行报错 ,只能再看代码进行猜测,但是线上日志堆栈不完整这个就让定位变得更加模糊,所以我把可能出现空指针的地方都做了处理,但是线上堆栈问题也让我好奇,就跟一个朋友聊了下这种情况,很巧合的是,他们之前遇到过,就跟我说让我配置下jvm的参数
-XX:-OmitStackTraceInFastThrow
线上日志截图如下


后面跟架构师聊这个问题,发现公司内部文章也有同事遇到,

所以当一些异常抛出的足够多的时候,JIT编译器会优化掉异常堆栈的信息。加入** -XX:-OmitStackTraceInFastThrow**参数才会显示所有的信息。
可以查看该偏文章
网友评论