背景 运营人员反馈线上某些操作异常,导致无法继续,但是只有个别,通过查询发现异常如下:
很奇怪的一种发现,api去调dubbo发现居然只有api的空指针,但是没有具体的原因。继续排查dubbo。
通过invoke 调用dubbo接口发现,异常居然打印不全.....只有java.lang.NullPointerException
百思不得其解.....
其间,通过查询日志发现的确日志只有这么一点点...
查询其他异常没有发现~
复现也未复现出来~
...
后面通过一位大佬的提醒说,jvm默认是启用:-XX: OmitStackTraceInFastThrow 当打印同样错误日志到一定次数就会被jvm默认优化掉。
立即马上重启服务,再invoke一下,发现如下:
总算复现以上bug,但是为什么只有空指针异常没有详细信息呢?
通过查询jdk5以后jvm做了一个优化,当同样错误日志频繁打印,JIT会重新编译抛出没有堆栈的信息异常。该默认式在-server 模式下是默认开启的~~
复现代码:
代码语言:javascript复制package com.jvm.omitstacktraceinfastthrow;
/**
* @author: csh
* @Date: 2021/1/28 09:48
* @Description:
*/
public class OmitStackTraceInFastThrowStudy {
private static String userName;
private static Integer age;
public static void main(String[] args) {
while (true){
try {
userName.length();
int i = age;
}catch (Exception e){
e.printStackTrace();
}
}
}
}
刚开始
最后到一定数量虚拟机就直接吃掉堆栈错误信息,只剩下空指针异常~
配置打印全部日志
-XX:-OmitStackTraceInFastThrow
可以看出打印了全部日志
最后查询该问题的方法有三:
1.查询历史日志,如果日志量比较大的话就很难了~~
2.重启服务调用对应接口,再查看;
3.直接关闭优化改为:-XX:-OmitStackTraceInFastThrow
参考文章:
https://www.cnblogs.com/liushijie/p/5446347.html
http://www.voidcn.com/article/p-tzxpekml-bn.html
本人工作之余,长期在线答疑解惑(仅帮助新手,高手请略过...)