可以对快速抛出异常进行热点JIT优化会导致模糊结果吗?

时间:2015-10-20 15:42:18

标签: java jvm-hotspot

This question处理JIT编译器确定它不再生成堆栈跟踪的情况,如果它认为它先前已经执行了一定次数。我知道这被称为"快速投掷"或"预先分配"异常。

一般来说,如果遇到这样一个预先分配的异常,那么在JIT认为值得编译之前,在JVM生命的某个早期点至少应该找到丢失的堆栈跟踪。

我的问题是,是否可以保证从报告的预先分配的异常发生到至少一个早期异常的实例的映射是确定性的,如果没有,是否有任何方法可以避免这种情况成为模糊性的来源使用-XX完全禁用优化:-OmitStackTraceInFastThrow。

一个简单的例子:

报告的缩短/预分配异常是通用的,例如NullPointerException。 如果在JVM的早期生命中只有一种类型的堆栈跟踪使用NPE,那么没问题。但是如果代码中的各个点已经存在多个NPE呢? JVM没有给出任何指示哪些或者是否已经编译出任何早期堆栈的指示,那么如何确定地确定堆栈跟踪本来会是什么?

这种情况真的会出现,还是现代热点JIT足够聪明以避免造成这种歧义?

1 个答案:

答案 0 :(得分:4)

JVM本身不会尝试将这些预先分配的异常映射到任何先前抛出的异常。 作为开发人员,您可以尝试猜测这些预分配的异常来自何处,但没有任何保证。

如果您正在尝试调试某些内容并查看无堆栈跟踪的异常,最安全的做法是在尝试查找问题根源时使用-XX:-OmitStackTraceInFastThrow禁用优化。