本段来自jvm规范:
Java虚拟机可能允许小而有界 异步异常之前执行的执行量 被扔了。允许此延迟以允许优化代码 在这些异常点检测并抛出这些异常 在遵守Java的语义的同时处理它们是切实可行的 编程语言。
我无法理解第二部分,即jvm允许线程在stop
ping之前运行一段时间的原因。
答案 0 :(得分:1)
让我们回想一下the definition of asynchronous exceptions:
大多数异常由于它们发生的线程的动作而同步发生。相反,异步异常可能在程序执行的任何时刻发生。
因此,当某个动作发生异常时,您只需知道,例如:当执行 athrow 指令时,将无条件地发生异常,当执行整数除法时,除数可以为零,或者当访问对象成员时,引用可以是null
。这是一组有限的操作,优化器会尽力进一步减少它,使用代码分析来证明除数不能为零。在特定代码位置,引用不能是null
。否则,它必须插入检查错误条件,以便在必要时生成并处理异常。但仅限于这些特定的代码位置。
相反,异步异常可能发生在每个代码位置,并且可能需要显式检查“自上次检查后我的线程上的另一个线程调用stop
”类型。您不希望在每条指令之后执行此类检查,因为这意味着在此类检查上花费的时间多于实际工作时间。
因此,只要保证到达下一次检查的时间有限,就可以执行多次指令直到下一次检查,因此这将排除具有不可预测的迭代次数的后向分支没有检查。另请注意,在优化代码中,可能存在未提交的操作,例如修改变量的值保存在CPU寄存器中。因此,即使在检测到异步异常发生之后,代码也必须提交这些待处理的动作,例如,在离开代码以响应异常之前,将这些值写回共享内存。