JVM如何知道在运行时捕获异常的位置?

Ale*_*ird 8 java jvm exception-handling exception stack-unwinding

根据我的理解,throw是一个灵长类似的jvm命令.调用它时,JVM"检查当前调用堆栈是否可以捕获它".如果它不能,那么java只是简单地弹出调用栈,就好像调用了一个返回一样.然后jvm"检查当前调用堆栈是否可以捕获它"等等递归.

我的问题:JVM在算法上如何知道调用堆栈中哪些地方可以捕获给定的异常?每个调用堆栈条目中是否存储了元数据,将异常映射到代码块?堆中是否有一个静态数据结构以某种方式跟踪它?因为某处必须有数据跟踪.

Jon*_*eet 9

JVM规范有这个细节.

特别是,第4.7.3节提供了有关异常表的详细信息,该异常表是一系列条目,说明在哪些指令之间捕获了异常.第3.12节给出了一个具体的例子.

这个元数据如何映射到JIT的本机代码当然是另一回事 - 而且是特定于实现的.例如,可能存在从本机JITted代码中的每个指令位置返回到原始字节码位置的一些映射,此时可以查询异常表以找到正确的处理程序.