Java jvm中的异步异常

Java jvm中的异步异常,java,multithreading,jvm,virtual-machine,Java,Multithreading,Jvm,Virtual Machine,本段摘自jvm规范: Java虚拟机可以允许一个小型但有界的 在异步异常之前发生的执行量 被抛出。允许此延迟以允许优化代码 在异常发生的位置检测并抛出这些异常 在遵守Java的语义的同时处理它们是很实用的 编程语言 我很难理解第二部分,即jvm让线程运行一段时间的原因,然后停止ping它 让我们回忆一下: 大多数异常都是由于发生它们的线程的操作而同步发生的。相反,异步异常可能发生在程序执行的任何时候 因此,当操作导致异常发生时,您只需知道,例如,当执行athrow指令时,异常将无条件发生;当执行

本段摘自jvm规范:

Java虚拟机可以允许一个小型但有界的 在异步异常之前发生的执行量 被抛出。允许此延迟以允许优化代码 在异常发生的位置检测并抛出这些异常 在遵守Java的语义的同时处理它们是很实用的 编程语言

我很难理解第二部分,即jvm让线程运行一段时间的原因,然后
停止
ping它

让我们回忆一下:

大多数异常都是由于发生它们的线程的操作而同步发生的。相反,异步异常可能发生在程序执行的任何时候

因此,当操作导致异常发生时,您只需知道,例如,当执行athrow指令时,异常将无条件发生;当执行整数除法时,除数可能为零;或者当访问对象成员时,引用可能为
null
。这是一组有限的操作,优化器会尽最大努力进一步减少它,使用代码分析证明除数不能为零。在特定代码位置,引用不能为
null
。否则,它必须插入错误条件的检查,以便在必要时生成和处理异常。但仅限于这些特定代码位置

相反,异步异常可能发生在每个代码位置,并且可能需要显式检查自上次检查以来在我的线程上执行的“Dod Other thread call
stop
”类型。您不希望在每个指令之后执行此类检查,因为这意味着在此类检查上花费的时间比实际工作上花费的时间要多

因此,允许在下一次检查之前执行多条指令,只要保证到达下一次检查的时间是有界的,因此这将排除具有不可预测的无检查迭代次数的向后分支。还要记住,在优化的代码中,可能存在未提交的操作,例如,修改变量的值保存在CPU寄存器中。因此,即使在检测到发生异步异常之后,代码也必须提交这些挂起的操作,例如,在离开代码以响应异常之前,将这些值写回共享内存