问题

一个接口报空指针,排查日志发现没有堆栈信息,只打印了一个 null:

  1. java.lang.NullPointerException: null

感觉好奇怪,最后找到原因是 HotSpot VM 使用 C2 编译器时,会默认开启 OmitStackTraceInFastThrow 配置,称为 FastThrow 优化,当某类异常多次出现,编译器会重新编译该方法抛出不提供堆栈跟踪的预分配异常来提高性能。

常见的异常

  • NullPointerException
  • ArithmeticException
  • ArrayIndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException

    结论

    如果要查看异常信息,有三种方法:

  • 查看历史日志

  • 重启应用
  • 配置 JVM 参数 -XX:-OmitStackTraceInFastThrow