【问题标题】:Asynchronous exceptions in jvmjvm中的异步异常
【发布时间】:2018-04-05 10:11:04
【问题描述】:

本段来自 jvm 规范:

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

我无法理解第二部分,即 jvm 让线程在stopping 之前运行一段时间的原因。

【问题讨论】:

    标签: java multithreading jvm virtual-machine


    【解决方案1】:

    让我们回忆一下the definition of asynchronous exceptions

    大多数异常是同步发生的,因为它们发生在线程中。相比之下,异步异常可能发生在程序执行的任何时候。

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

    相比之下,异步异常可能发生在每个代码位置,并且可能需要明确检查“自上次检查以来我的线程上是否有另一个线程调用stop”类型。您不希望在每条指令之后都执行此类检查,因为这意味着在此类检查上花费的时间比实际工作要多。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多