-
OmitStackTraceInFastThrow
是对 C2编译的代码的优化,可以抛出某些隐式异常而无需堆栈跟踪。
- 优化仅适用于隐式异常,即JVM本身引发的异常,而不是用户代码引发的异常。这些隐式异常是:
- NullPointerException
- ArithmeticException
- ArrayIndexOutOfBoundsException
- ArrayStoreException
- ClassCastException
- 仅当JVM知道该特定位置较早发生了异常时,才会忽略堆栈跟踪。
因此,在HotSpot JVM中,如果满足以下所有条件,则不会有堆栈跟踪:1)抛出方法是热的,即由C2编译; 2)这是一个隐式异常,例如由obj.method()
引发的NPE,但不是throw new NullPointerException()
引发的; 3)至少第二次引发异常。
优化的目的是消除在快速路径上反复抛出隐式异常的情况(可能很少)的性能影响。我认为这不是正常情况。异常(尤其是隐式异常)通常表示需要修复的错误条件。从这个意义上讲,可以禁用-XX:-OmitStackTraceInFastThrow
。例如。在生产环境中,我们始终禁用它,这节省了我们很多调试时间。但是,我承认,如果存在这样的优化,在某些情况下它可以帮助解决性能问题。
TL; DR 的确可以添加一个-XX:-OmitStackTraceInFastThrow
选项,除非应用程序中的热路径上有许多隐式异常。
本文链接:https://www.f2er.com/3165750.html