patch code技术

patch code技术

patch code技术 #

在 Java 语言中,类是按需加载的。也就是对于一个 class 文件,只有当 hotspot 第一次使用它的时候,它才会被加载进来。假如我们在即时编译 A 方法的时候要调用 B 方法,但这时 B 方法还没有被加载进来,该怎么办呢?

虚拟机会采用一种叫做 patch code 的技术,在运行时再进行加载。简单地说,就是在生成 call 指令时候,它的目标地址填成一个虚拟机内部的用于解析符号的方法。在 CPU 执行这条 call 语句的时候,就会调用符号解析函数。此时虚拟机就会加载 B 方法所在的类,然后就能确定 B 方法的地址了,这时再把 B 方法的地址写回到 call 指令里。这个过程如下图所示:

这个过程很像是在给原始的代码打补丁,所以人们就把这种方式称为 patch code 技术。这就像是在原来的代码安装了一个机关,当 CPU 执行到这个机关时,就会触发一次符号的重定位,然后这个机关就被替换掉了。下一次 CPU 再执行到这个 call 指令的时候,就可以正常地调用到 B 方法了。

Viewpoint #

From #

08 | 动态链接(下):延迟绑定与动态链接器是什么?