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

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

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

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

百思不得其解.....

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

        查询其他异常没有发现~

        复现也未复现出来~

         ...

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

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

总算复现以上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();
            }
        }


    }
}

刚开始

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

配置打印全部日志

-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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值