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

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

异常解决:jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息_第1张图片

很奇怪的一种发现,api去调dubbo发现居然只有api的空指针,但是没有具体的原因。继续排查dubbo。

通过invoke 调用dubbo接口发现,异常居然打印不全.....只有java.lang.NullPointerException

异常解决:jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息_第2张图片

百思不得其解.....

        其间,通过查询日志发现的确日志只有这么一点点...

        查询其他异常没有发现~

        复现也未复现出来~

         ...

后面通过一位大佬的提醒说,jvm默认是启用:-XX:+OmitStackTraceInFastThrow 当打印同样错误日志到一定次数就会被jvm默认优化掉。

立即马上重启服务,再invoke一下,发现如下:

异常解决:jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息_第3张图片

总算复现以上bug,但是为什么只有空指针异常没有详细信息呢?

通过查询jdk5以后jvm做了一个优化,当同样错误日志频繁打印,JIT会重新编译抛出没有堆栈的信息异常。该默认式在-server 模式下是默认开启的~~

复现代码:

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();
            }
        }


    }
}

刚开始

异常解决:jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息_第4张图片

最后到一定数量虚拟机就直接吃掉堆栈错误信息,只剩下空指针异常~

异常解决:jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息_第5张图片

配置打印全部日志

-XX:-OmitStackTraceInFastThrow

异常解决:jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息_第6张图片

可以看出打印了全部日志

异常解决:jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息_第7张图片

最后查询该问题的方法有三:

1.查询历史日志,如果日志量比较大的话就很难了~~

2.重启服务调用对应接口,再查看;

3.直接关闭优化改为:-XX:-OmitStackTraceInFastThrow

参考文章:

https://www.cnblogs.com/liushijie/p/5446347.html

http://www.voidcn.com/article/p-tzxpekml-bn.html

本人工作之余,长期在线答疑解惑(仅帮助新手高手请略过...),如有疑问可以关注以下公众号或关注博客回复"新手问答"获取博主联系方式~

你可能感兴趣的:(jvm,java,bug,zookeeper,consul)