java – 快速抛出异常的Hotspot JIT优化会导致模糊的结果吗?
作者:互联网
This question处理JIT编译器确定它不再生成堆栈跟踪的情况,如果它认为它先前已经执行了一定次数.我知道这被称为“快速投掷”或“预分配”例外.
一般来说,如果遇到这样一个预先分配的异常,那么在JIT认为值得编译之前,缺少的堆栈跟踪应该在JVM生命的某个早期点至少找到一次.
我的问题是,从报告的预分配异常发生的映射到至少一个早期异常的实例的映射是否可以保证是确定性的,如果没有,是否有任何方法可以避免这种情况成为歧义的根源而不是禁用优化完全使用-XX:-OmitStackTraceInFastThrow.
一个简单的例子:
报告的缩短/预分配异常是通用的,例如NullPointerException.
如果在JVM的早期生命中只有一种类型的堆栈跟踪使用NPE,那么没问题.但是如果代码中的各个点已经存在多个NPE呢? JVM没有给出任何指示哪些或者是否已经编译出任何早期堆栈的指示,那么如何确定地确定堆栈跟踪本来会是什么?
这种情况真的会出现,还是现代热点JIT足够聪明,以避免产生这种模糊性?
解决方法:
JVM本身不会尝试将这些预先分配的异常映射到任何先前抛出的异常.
作为开发人员,您可以尝试猜测这些预分配的异常来自哪里,但没有任何保证.
如果您正在尝试调试某些内容并查看无堆栈跟踪的异常,最安全的做法是在尝试查找问题根源时使用-XX:-OmitStackTraceInFastThrow禁用优化.
标签:java,jvm-hotspot 来源: https://codeday.me/bug/20190623/1271863.html