: null 解决

时间:2025-02-27 08:13:15

: null 解决

文章目录

  • : null 解决
    • 解决方法
    • 问题原因

今天工作中,遇到一个问题,日志 : null 相当懵逼,没有详细堆栈信息。

解决方法

在java启动命令中添加-XX:-OmitStackTraceInFastThrow即可输出详细堆栈信息。

问题原因

JVM(HotSpot JVM)进行了优化。当第一次发生异常(通常为NullPointerException)时,将打印完整的堆栈跟踪,并且JVM会记住堆栈跟踪(或者可能只是代码的位置)。 当该异常经常发生时,将不再打印堆栈跟踪,这既可以实现更好的性能,又不会使相同的堆栈跟踪充满日志。
参看JVM源码(参见下),可见这个优化同时试用于以下异常:

  • NullPointerException
  • ArrayIndexOutOfBoundsException
  • ClassCastException
  • ArrayIndexOutOfBoundsException
  • ArrayStoreException
  • ArithmeticExceptio
    相关核心代码片段:
  // If this throw happens frequently, an uncommon trap might cause  // a performance pothole.  If there is a local exception handler,  // and if this particular bytecode appears to be deoptimizing often,  // let us handle the throw inline, with a preconstructed instance.  // Note:   If the deopt count has blown up, the uncommon trap  // runtime is going to flush this nmethod, not matter what.

  if (treat_throw_as_hot      && (!StackTraceInThrowable || OmitStackTraceInFastThrow)) {// If the throw is local, we use a pre-existing instance and// punt on the backtrace.  This would lead to a missing backtrace// (a repeat of 4292742) if the backtrace object is ever asked// for its backtrace.// Fixing this remaining case of 4292742 requires some flavor of// escape analysis.  Leave that for the * ex_obj = NULL;switch (reason) {case Deoptimization::Reason_null_check:

      ex_obj = env()->NullPointerException_instance();      break;case Deoptimization::Reason_div0_check:

      ex_obj = env()->ArithmeticException_instance();      break;case Deoptimization::Reason_range_check:

      ex_obj = env()->ArrayIndexOutOfBoundsException_instance();      break;case Deoptimization::Reason_class_check:      if (java_bc() == Bytecodes::_aastore) {

        ex_obj = env()->ArrayStoreException_instance();

      } else {

        ex_obj = env()->ClassCastException_instance();

      }      break;default:      break;

    }

参考
: null”原因解决
NullPointerException in Java with no StackTrace