专栏首页一猿小讲定位生产问题时,异常堆栈莫名丢了,何解?

定位生产问题时,异常堆栈莫名丢了,何解?

今天分享的这个知识有点冷,相信很多 Java 程序员很少遇到,废话不多说,直接进入排查问题的真实讨论现场。

小 猿:有个 NPE 异常,有空帮忙看看是哪里出的?

架构狮:我没有看到空指针堆栈啊!?

小 猿:有堆栈我就自己找问题了,就不劳驾您老啦(捂嘴笑)。

架构狮:是不是 NPE 报了好多次?

小 猿:是。

架构狮:一猜就是,因为只有报了很多次,Java 才会自动不打印异常堆栈信息(言外之意:报了多了 java 会省略的),那就找找最开始报异常的日志,肯定会有堆栈信息的(哈哈,心里有谱啦),这种机制叫做 fast throw。

1

异常堆栈信息丢了?

只见 Java 攻城狮小猿傻傻的盯着业务日志,一脸呆萌... ...

[2020-08-15 00:00:00]: 668812118 Thread-8 [ERROR] payService:java.lang.NullPointerException

与其傻傻迷思,不妨直接来个现场说法,talk is cheap,show me the code,直接上代码。

/**
 * Fast Throw 知识点分享
 * @author 一猿小讲
 */
public class NPETest {
    public static void main(String[] args) {
        String msg = null;
        for (int i = 0; i < 1000000; i++) {
            try {
                // msg 为空,会出现空指针异常
                System.out.println(msg.length());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

程序刚开始跑的时候,程序输出是下面这样子的。

java.lang.NullPointerException
  at NPETest.main(NPETest.java:11)
... ... 
java.lang.NullPointerException
  at NPETest.main(NPETest.java:11)

一会儿的功夫,输出却变成下面这个样子,异常堆栈确实丢了。

java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException

架构狮:惊奇不?有没有匪夷所思。

小 猿:何解?

架构狮:这种现象就叫做 fast throw,是 Java 虚拟机的一个优化,如果发现代码同一个位置频繁抛出同一类型的异常时,异常堆栈信息就会被清空,那么速度就会非常快,就不用再额外分配内存。

到这儿,Java 攻城狮小猿,点了一根香烟,感觉受益颇深,不过却又陷入了沉思。

2

Fast Throw 深入一点,又何妨?

思考一:查问题也太不方面了,如何让异常堆栈信息展示呢?

首先要清楚,JVM 会默认开启 Fast Throw 优化。如果想关闭这个优化,通过配置 -XX:-OmitStackTraceInFastThrow 就可以。

接下来还是跑上面 NPETest 的例子,配置 VM 参数,一起操作一把。

IDEA 运行时指定参数:-XX:-OmitStackTraceInFastThrow。

控制台运行时指定参数:

java -XX:-OmitStackTraceInFastThrow NPETest

效果很明显,异常堆栈信息一直坚挺到最后:

... ...
java.lang.NullPointerException
        at NPETest.main(NPETest.java:11)
java.lang.NullPointerException
        at NPETest.main(NPETest.java:11)
java.lang.NullPointerException
        at NPETest.main(NPETest.java:11)

话又说来,如何再开启 fast throw 优化呢?

方式一:默认就是开启优化;
方式二:-XX:+OmitStackTraceInFastThrow

思考二:除了 NPE 异常,JVM 开启 fast throw 优化的异常还有哪些?

  • ArithmeticException
  • ArrayIndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException

烟味灭,酒过半,Java 攻城狮小猿彻底掌握了技巧,嘴角洋溢着笑容,此番操作不但解决了生产问题,而且又 get 一装逼技能... ...

3

寄语写最后

本次,主要对小猿在排查生产上遇到的一个匪夷所思的问题,作为基础进行展开,简单对 JVM 特定类型的异常的 fast throw 优化进行了解,希望对大家有帮助。

本文分享自微信公众号 - 一猿小讲(yiyuanxiaojiangV5),作者:一猿小讲

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 14 来势汹汹,这回让空指针无处遁形!!

    相信在坐的每一位 Java 程序员都遇到过空指针异常:NullPointerException(NPE),不甚其烦。

    Java技术栈
  • Bugless 异常监控系统 (iOS端)

    移动App 发布后,如果想获取 App 的业务运行状态,通常是通过服务端接口反映到状态或者是用户反馈,缺少客户端的异常错误的线上监控、告警与异常数据聚合并沉淀的...

    37手游iOS技术运营团队
  • 一个线程罢工的诡异事件

    事情(事故)是这样的,突然收到报警,线上某个应用里业务逻辑没有执行,导致的结果是数据库里的某些数据没有更新。

    用户1516716
  • 一个线程罢工的诡异事件

    事情(事故)是这样的,突然收到报警,线上某个应用里业务逻辑没有执行,导致的结果是数据库里的某些数据没有更新。

    用户5397975
  • 一个线程罢工的诡异事件

    事情(事故)是这样的,突然收到报警,线上某个应用里业务逻辑没有执行,导致的结果是数据库里的某些数据没有更新。

    周萝卜
  • Nacos Client 1.4.1 版本踩坑记录

    就在这周,我接到 MSE Nacos 用户的反馈,说线上 Nacos 不可用,服务都下线了,日志里面也是一堆报错,我下意识以为线上炸了,赶紧上线排查。本文主要记...

    kirito-moe
  • ARMv8 异常处理简介

    内核稳定性问题复杂多样,最常见的莫过于“kernel panic”,意为“内核恐慌,不知所措”。这种情况下系统自然无法正常运转,只能自我结束生命,留下死亡信息。...

    刘盼
  • 通过 JFR 与日志深入探索 JVM - 2. JFR 基本原理以及快慢因素

    我个人有个习惯,对于要用的一个新的框架,新的中间件等等,我一般不太信任它的官网“吹”的优点以及性能测试,我一般会一边使用一边自己测试,并且猜想其内部实现并结合源...

    干货满满张哈希
  • 在这个亿级流量的时代,不懂性能调优,那你真的就吃亏了!

    在当下的时代,懂高并发性能调优,一定是你在技术进阶赛道变得牛逼的加分项。不论,你是开发,架构还是管理岗,亦或者是其他互联网相关岗位。 因为毫不夸张的说,在现在动...

    程序员追风
  • 深度探索JFR - JFR详细介绍与生产问题定位落地 - 1. JFR说明与启动配置

    我们都知道,黑匣子是用于记录飞机飞行和性能参数的仪器。在飞机出问题后,用于定位问题原因。JFR 就是 Java 的黑匣子。

    干货满满张哈希
  • Java 异常处理的 20 个最佳实践,你知道几个?

    异常处理是 Java 开发中的一个重要部分,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java 提供了几个异常处理特性,以try,catc...

    武培轩
  • 前端工程师自检清单73答

    本文参考文章《一名【合格】前端工程师的自检清单》, 并对其中的部分题目进行了解答,若有遗漏或错误之处望大家指出纠正,共同进步。(点击题目展开答案!)

    小皮咖
  • GDB调试core文件样例(如何定位Segment fault)

    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump....

    阳光岛主
  • 【穿山甲系列】像修复Crash一样修复卡顿

    大家在做Android项目时,是否对以下一幕感到很熟悉?

    腾讯移动品质中心TMQ
  • 一行代码,一个系统!您的 Crash 实时分析已上线

    腾讯移动分析(MTA),将内部打磨多年的 Crash分析能力对外输出,在复杂的App生态下,专注于构建完善的质量体系,助力 App 研发者用一行代码拥有完整 C...

    腾讯大数据
  • 移动端性能监控方案Hertz

    性能问题是造成App用户流失的罪魁祸首之一。App的性能问题包括崩溃、网络请求错误或超时、响应速度慢、列表滚动卡顿、流量大、耗电等等。而导致App性能低下的原因...

    美团技术团队
  • 腾讯 Node.js 非侵入开发框架 Tars.js 2.0 正式发布

    腾讯开源
  • ANR 原理与实战技巧

    ? 00 手机用用,就卡卡卡。莫名其妙的出现一堆程序无响应,欲哭无泪。这是为什么呢?因为你用的android手机。 android手机,为了...

    用户1263308
  • Java面试题-基础篇四

    两个或一个都有可能,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。

    用户5224393

扫码关注云+社区

领取腾讯云代金券