700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 打印异常堆栈_定位生产问题时 异常堆栈莫名丢了 何解?

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

时间:2021-09-14 08:40:42

相关推荐

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

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

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

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

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

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

小 猿:是。

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

异常堆栈信息丢了?

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

[-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.NullPointerExceptionjava.lang.NullPointerExceptionjava.lang.NullPointerExceptionjava.lang.NullPointerException

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

小 猿:何解?

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

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

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 优化的异常还有哪些?

ArithmeticExceptionArrayIndexOutOfBoundsExceptionArrayStoreExceptionClassCastException

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

寄语写最后

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

好了,本次就谈到这里,一起聊技术、谈业务、谈架构,少走弯路,不踩大坑。欢迎关注「一猿小讲会持续输出原创精彩分享,敬请期待!

历史文章推荐阅读

Java线程池深度揭秘

程序员写出这样的代码,能不挨骂吗?

fastjson的这些坑,你误入了没?

Java 如何利用钩子函数实现优雅停服?刨根问底

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。