OmitStackTraceInFastThrow
是在 C2 编译的 代码中的优化,可以抛出某些隐式异常而不包含堆栈跟踪。因此,在 HotSpot JVM 中,只有满足以下所有条件时,异常才不会有堆栈跟踪:1)抛出方法是热点方法,即由 C2 编译;2)它是隐式异常,例如通过obj.method()
抛出的 NPE,而不是通过 throw new NullPointerException()
抛出的;3)该异常至少被抛出了两次。
-XX:-OmitStackTraceInFastThrow
是可以的。例如,在我们的生产环境中,我们总是禁用它,并且它为我们节省了大量的调试时间。然而,我承认,如果存在这样的优化,就有一些情况可以帮助解决性能问题。-XX:-OmitStackTraceInFastThrow
选项确实是一个好主意,除非您的应用程序中有许多热点路径上的隐式异常。
for (int i = 0; i < 100_000; i++) {try {throwsNPE();} catch (NullPointerException e) {}}; throwsNPE();
。如果你遇到了类似的情况,那么你应该已经有足够多的堆栈跟踪了。 - Johannes Kuhn