JAVA异常堆栈信息被吃掉的原因

线上Dubbo请求出现空指针异常,但未显示详细堆栈信息。通过逐步定位,发现问题出在`map.getOrDefault()`方法的一个参数,导致空对象调用`toString`方法。排查过程中发现,Java虚拟机做了优化,默认忽略某些堆栈信息。为打印堆栈,需在启动JVM时添加特定参数。本文涉及标准参数、非标准参数和非Stable参数的区别,并提供相关JDK测试日志链接。
摘要由CSDN通过智能技术生成

背景

线上dubbo请求,报空指针,但是没有具体堆栈信息,无法找到报错的源头

任务

首先找出源头解决燃眉之急,加try catch 块,一步一步缩小范围,最终发现是
map的getOrDefault()方法的一个参数是a->null类型的参数获取到null并给了toString方法,所以报空。

行动

首先排查了不是dubbo 的异常过滤器(exceptionFilter)导致的。
然后google到,是Java虚拟机做了一些优化,堆栈信息给忽略了,如果想要打印出堆栈信息,需要在Java虚拟机启动的时候加一个参数。

其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
X),此类参数各个jvm实现会有所不同࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Think_Higher

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值