JVM Runtime Data Area#

JVM Stack Frame#

Exception#
JVM 对异常的描述是 “本质上是程序控制权的一种即使的、非局部的(nonlocal)的转换 —— 从异常抛出的地方转移到处理异常的地方”
同步异常,由于当前线程指定的某个操作导致的异常,大部分异常都属于同步异常
异步异常,线程 A 强制打断线程 B,线程 B 产生的异常,因为线程 B 现在执行到什么地方的并不知道
异步异常被抛出前,允许执行一小段代码,使得代码优化器在不违反程序语义的情况下,检测到异常并抛给可以处理它们的地方
方法会绑定异常处理器,当出现当前方法出现异常时,JVM 搜索该方法的异常处理器,判断是否有异常处理器可以处理,有则跳转处理,没有则抛出异常给调用者,重复步骤,如果到最上层都没有处理,执行线程终止。

bytecode instruction set#
JVM 的指令与 CPU 指令集类似,由操作码和操作数组成,可以没有操作数。
如果不考虑异常,JVM 的工作逻辑如下

实现#
- JVM 字节码在加载或执行时,翻译成另外一种虚拟机指令集,如 TeaVM 可翻译为 WASM
- 可以在加载时或执行时,翻译成宿主机 CPU 的本地指令集(JIT)