JVM什么时候开始忽略堆栈跟踪?

我对该主题进行了很多搜索。但是没有具体的解决方案/指南。

docs

  

某些情况下,某些虚拟机可能会 省略一个或   来自堆栈跟踪的更多堆栈帧。在极端情况中,   没有与此相关的堆栈跟踪信息的虚拟机   允许throwable通过此方法返回零长度数组。

有人可以阐明这种情况可能发生/将发生什么情况吗?

我知道,如果一次又一次地产生相同的堆栈跟踪,就会发生这种情况(计数没有硬性规定,AFIAK-否则请纠正我)。但是,难道这不应该具有明确的行为吗?

此外,根据this,传递-XX:-OmitStackTraceInFastThrow将确保我的StackTrace不会丢失。在生产机器中总是这样做是不是明智的?

hahahaha548 回答:JVM什么时候开始忽略堆栈跟踪?

  1. OmitStackTraceInFastThrow是对 C2编译的代码的优化,可以抛出某些隐式异常而无需堆栈跟踪。
  2. 优化仅适用于隐式异常,即JVM本身引发的异常,而不是用户代码引发的异常。这些隐式异常是:
    • NullPointerException
    • ArithmeticException
    • ArrayIndexOutOfBoundsException
    • ArrayStoreException
    • ClassCastException
  3. 仅当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

大家都在问