java - jvm中的异步异常

标签 java multithreading jvm virtual-machine

这段来自jvm规范:

A Java Virtual Machine may permit a small but bounded amount of execution to occur before an asynchronous exception is thrown. This delay is permitted to allow optimized code to detect and throw these exceptions at points where it is practical to handle them while obeying the semantics of the Java programming language.

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

最佳答案

让我们记忆一下the definition of asynchronous exceptions :

Most exceptions occur synchronously as a result of an action by the thread in which they occur. An asynchronous exception, by contrast, can potentially occur at any point in the execution of a program.

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

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

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

关于java - jvm中的异步异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49669742/

相关文章:

java - 弹性 Spring jpa hibernate

java - 将字符串转换为 Joda LocalTime 格式 (HH :mm:ss) and Remove milliseconds

java.io.File.isFile() 在不同线程中返回不同的值

python - 从 Django 后保存信号生成线程是否可以?

java - 使用复选框在文本区域包装文本

java - Swing 中的 JFrame 窗口是否运行在它们自己的独立线程上?

java - 将Java连接到MySQL数据库

java - 设置 JVM 参数启动 catalina.bat

java - ASM Tree API 插入 InsnList 会出现 StackOverflowError?

java - 无法在我的自定义 arraylist 实现中显示列表值