我很好奇 Java JVM 有时如何内联有可能抛出异常的方法。我假设至少可以内联一些这样的方法(例如那些具有数组访问权限并因此有可能抛出 ArrayIndexOutOfBoundsException
的方法)。我看到的问题是,如果确实发生了异常,那么如果您已经内联该方法,您如何显示正确的堆栈跟踪?既然可以在不同的机器上内联不同的方法,内联如何不破坏堆栈跟踪机制?
最佳答案
您设想的问题是什么?由于是 JVM 本身进行内联,因此没有什么可以阻止它记住它在何处内联的内容,并在构造堆栈跟踪以安装到 Throwable 对象中时对此进行更正。
当构造抛出异常时,JVM 将遍历 CPU 堆栈并确定每个机器堆栈帧是否对应于解释的字节码、JIT 代码、库中的 native 代码等。为此,它引用了一些表,这些表告诉机器代码中的哪些地址对应于字节码中的哪些指令(如果类文件中存在该信息,则进一步返回源代码行)。这张表可以很好的说明JITted代码中的某个地方可以对应多个Java级别的栈帧。
但是,不需要 JVM 来执行此操作。它也可以选择简单地构建其中带有神秘中断的堆栈跟踪。查看javadoc for Throwable.getStackTrace() . (甚至不要求 JVM 完全能够生成堆栈跟踪)。
关于java - 如何内联抛出异常的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7218575/