1
340244120w 2021-02-03 12:41:19 +08:00 2
居然最后没有公众号链接!
不过说回来,我们为了减少异常栈输出,自定义业务类异常类都是 @Override public Throwable fillInStackTrace() { return null; } |
2
sadfQED2 2021-02-03 12:48:48 +08:00 via Android 1
这就是我不敢去写 java 的原因,jvm 各种奇奇怪怪的优化太多了。这特么谁能想到啊
|
3
tedzhou1221 2021-02-03 13:07:51 +08:00 via iPhone 1
类似情况,在我们生产有发生过。
公共方法,空指针。 一堆报错日志发到运维邮箱。内容就一行 就显示空指针,也没显示哪一行出问题…… |
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 1
线上遇到过这种问题,xx 同事说,加了个日志修复了。其实是,重启了就恢复了。
|
12
manecocomph OP @justlikemaki 哈哈, 那是不是过段时间又重现了. xx 同事在去掉日志又可以修复一次...
|
14
uselessVisitor 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 嗯嗯确实是,这个优化的很隐蔽。。
|