![]() | 1 340244120w 2021-02-03 12:41:19 +08:00 ![]() 居然最后没有公众号链接! 不过说回来,我们为了减少异常栈输出,自定义业务类异常类都是 @Override public Throwable fillInStackTrace() { return null; } |
![]() | 2 sadfQED2 2021-02-03 12:48:48 +08:00 via Android ![]() 这就是我不敢去写 java 的原因,jvm 各种奇奇怪怪的优化太多了。这特么谁能想到啊 |
![]() | 3 tedzhou1221 2021-02-03 13:07:51 +08:00 via iPhone ![]() 类似情况,在我们生产有发生过。 公共方法,空指针。 一堆报错日志发到运维邮箱。内容就一行 就显示空指针,也没显示哪一行出问题…… |
4 manecocomph OP @340244120w 哈哈, 原文里面有, 最后就不放了. 谢谢捧场. 你这个返回 null 的我还是第一次见. 涨见识. |
5 manecocomph OP @sadfQED2 JIT 编译时会有各种优化. 大多数不会产生这种异常. |
6 manecocomph OP @tedzhou1221 那基本就是这个问题. 所以要找到最初报这个空指针的地方. 或者使用 BTrace 检测 new NPEException 的点, 打印 stack. |
![]() | 7 cheng6563 2021-02-03 14:06:30 +08:00 这种一般找到第一个异常就行了。 |
8 manecocomph OP @cheng6563 是的. 如果第一个异常太久了或者日志被 rotate 了 第一个日志就比较难找. |
9 timi 2021-02-03 14:44:26 +08:00 如果日志滚没了,有办法让 JVM 逆优化回去吗 |
10 manecocomph OP @timi 一段时间内这个方法或者 for 循环体内的方法不再过热. 它是计算一个滑动时间窗口内被执行的次数. 如果次数降下来 因为存编译代码的空间有限, 这段代码可能会被逆优化. 当然, 如果重启 server, 自然又恢复到开始状态了. |
11 justlikemaki 2021-02-03 14:55:49 +08:00 ![]() 线上遇到过这种问题,xx 同事说,加了个日志修复了。其实是,重启了就恢复了。 |
12 manecocomph nbsp; OP @justlikemaki 哈哈, 那是不是过段时间又重现了. xx 同事在去掉日志又可以修复一次... |
14 zm8m93Q1e5otOC69 2021-02-04 08:49:16 +08:00 排版难受 |
15 hustmisa 2021-02-04 10:04:59 +08:00 这不是很正常且符合逻辑的优化么 如果相同的异常堆栈特别多,类似你这种循环 100000,异常的堆栈会增加 io 甚至写满磁盘,这时候你重启或者找到错误开始的位置就能看到堆栈,而且一个完全重复无数次的东西记录干嘛,你业务日志会记录完全重复没用的东西么; 如果相同的错误很少,根本不会被省略。 |
16 manecocomph OP @hustmisa 是正常且符合逻辑的优化. 只是很少看到这种文档介绍这种知识, 导致第一次见到这种情形, 不知道栈去哪里了. |
17 manecocomph OP @beichenhpy 是的, 我为了省事, 直接复制过来了. 直接读微信原文排版会好点. 下次写个提示. |
![]() | 18 MineDog 2021-02-04 17:01:48 +08:00 @340244120w #1 构造方法可以直接关闭,为什么要重写呢? |
![]() | 19 340244120w 2021-02-04 17:51:28 +08:00 via iPhone |
![]() | 20 340244120w 2021-02-04 17:52:56 +08:00 via iPhone @MineDog 重写更简单,构造方法也挺好,主要当时也没注意到 |
![]() | 21 MineDog 2021-02-04 17:57:12 +08:00 @340244120w #20 参数控制的方式更灵活吧 |
![]() | 22 340244120w 2021-02-04 18:06:54 +08:00 @MineDog #21 嗯嗯 |
23 hustmisa 2021-02-05 09:53:11 +08:00 @manecocomph 嗯嗯确实是,这个优化的很隐蔽。。 |