JVM参数OmitStackTraceInFastThrow:不打印NullPointerException异常堆栈
查看线上日志,遇到一个诡异的问题,就是系统大量空指针的异常,但是没有打印堆栈,导致不方便定位问题。
经过一番代码调试,确定并非程序代码问题。没有线索之后,从Google找到了答案:是因为在server模式下运行的时候,有一个默认选项是-XX:+OmitStackTraceInFastThrow,这个玩意的意思就是当大量抛出同样的异常的后,后面的异常输出将不打印堆栈,打印堆栈的时候底层会调用到Throwable.getOurStackTrace()方法,而这个方法是synchronized的,对性能有比较明显对影响。所以这个参数是合理的。正常情况下,如果打印了几万条异常堆栈是很容易发现问题的。但是我们的系统正好赶上访问量高峰,一不留神就错过打印详细堆栈的阶段了。
复现测试代码:
public class NullPointExceptionTest {
static final Logger logger = LoggerFactory.getLogger(NullPointExceptionTest.class);
public static void main(String[] args) {
String test = null;
int i = 0;
while (true) {
try {
test.length();
} catch (Exception e) {
System.out.println(i++ + " - " + e.getStackTrace().length);
if (e.getStackTrace().length == 0) {
logger.error("e is", e);
break;
}
}
}
}
}
知道原因后,那我们的解决办法可以有:
- 历史数据还在的话,下载历史数据查看;
- 重新启动服务器,再观察日志;
- 设置JVM参数,暂时禁止掉这个优化选项:-XX:+OmitStackTraceInFastThrow。
最新文章
- Project Euler欧拉计划
- 企业app分发
- windows 下配置 nginx的问题
- Prim算法和Kruskal算法(图论中的最小生成树算法)
- Android拍照保存在系统相册不显示的问题
- toad for sqlserver5.7
- Struts2通配符映射
- C#-禁止调整窗体的大小
- IO流中的文件创建并且写入读取
- 三大主流ETL工具选型
- Gitlab管理下本地Git配置
- bzoj 3712: [PA2014]Fiolki
- 【Win 10 应用开发】MIDI 音乐合成——更改乐器音色
- jquery 遍历表格,需要表格中每个td的内容
- [BZOJ3207] 花神的嘲讽计划Ⅰ (主席树)
- iOS设计指南
- Linux查看和修改时间、日期
- Python2和Python3中urllib库中urlencode的使用注意事项
- await这个关键词以及asyncio.wait asyncio.gather
- Badboy录制Jmter脚本
热门文章
- selenium自动化-java-IE启动
- [No00007A]没有文件扩展";.js";的脚本引擎 解决办法
- sql server 导出表结构到 word
- BZOJ 4548 小奇的糖果
- ES5基础之正则表达式01:初次见面
- 使用工具安装,运行,停止,卸载Window服务
- Yeelink 初探
- 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG
- 76 mkswaP-用于设置交换区
- MyBatis的foreach标签与SUM函数同时使用