异常解决:jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息

2021-03-04 14:34:31 浏览数 (1)

背景 运营人员反馈线上某些操作异常,导致无法继续,但是只有个别,通过查询发现异常如下:

很奇怪的一种发现,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

本人工作之余,长期在线答疑解惑(仅帮助新手,高手请略过...)

0 人点赞