查看线上日志,遇到一个诡异的问题,就是系统大量空指针的异常,但是没有打印堆栈,导致不方便定位问题。

经过一番代码调试,确定并非程序代码问题。没有线索之后,从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;
}
}
}
}
}

知道原因后,那我们的解决办法可以有:

  1. 历史数据还在的话,下载历史数据查看;
  2. 重新启动服务器,再观察日志;
  3. 设置JVM参数,暂时禁止掉这个优化选项:-XX:+OmitStackTraceInFastThrow。

最新文章

  1. Project Euler欧拉计划
  2. 企业app分发
  3. windows 下配置 nginx的问题
  4. Prim算法和Kruskal算法(图论中的最小生成树算法)
  5. Android拍照保存在系统相册不显示的问题
  6. toad for sqlserver5.7
  7. Struts2通配符映射
  8. C#-禁止调整窗体的大小
  9. IO流中的文件创建并且写入读取
  10. 三大主流ETL工具选型
  11. Gitlab管理下本地Git配置
  12. bzoj 3712: [PA2014]Fiolki
  13. 【Win 10 应用开发】MIDI 音乐合成——更改乐器音色
  14. jquery 遍历表格,需要表格中每个td的内容
  15. [BZOJ3207] 花神的嘲讽计划Ⅰ (主席树)
  16. iOS设计指南
  17. Linux查看和修改时间、日期
  18. Python2和Python3中urllib库中urlencode的使用注意事项
  19. await这个关键词以及asyncio.wait asyncio.gather
  20. Badboy录制Jmter脚本

热门文章

  1. selenium自动化-java-IE启动
  2. [No00007A]没有文件扩展".js"的脚本引擎 解决办法
  3. sql server 导出表结构到 word
  4. BZOJ 4548 小奇的糖果
  5. ES5基础之正则表达式01:初次见面
  6. 使用工具安装,运行,停止,卸载Window服务
  7. Yeelink 初探
  8. 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG
  9. 76 mkswaP-用于设置交换区
  10. MyBatis的foreach标签与SUM函数同时使用