8.1.13 _quick 指令
Java虚拟机的第一版规范中描述了一种用来加速字节码解释的技术,Sun早期的一种java虚拟机实现中曾经使用过它。这种方案是,如果常量池入口已经被解析过,使用常量池人口的操 作码会被一个“_quick”操作码取代。当虚拟机遇到一个_quick指令时,它就知道常量池人口已 经被解析过了,所以这条指令可以执行得更快。
Java虚拟机的核心指令集包含200条单字节操作码,它们都可以在附录A中找到在class文 件中只会见到这200条操作码。使用“_quick”技术的虛拟机实现内部还另外使用25条“_quick”单字节操作码。
举例来说,当使用_quick技术的虚拟机解析一个ldc指令(操作码0x12 )引用的常量池人口时,它在字节码流中用ldc_quick指令(操作码Oxcb )替換ldc操作码字节。在Sun的早期虚拟机 中,这项技术是属于直接引用替换符号引用这个操作的一部分。
除了用_quick操作码覆盖原来的普通操作码之外,使用_quick技术的虚拟机对某些指令还会用表示直接引用的数据覆盖指令的操作数。比如,除了把invokevirtual操作码替换成 invokcvirtual_quick之外,虚拟机还把方法表偏移量和参数的个数放入每个invokevirtual指令后面 的两个操作数字节中。在invokevirtual_quick操作码后面的字节码流中直接用方法表偏移量,节约了在解析过的常量池入口中査找偏移量的时间。
8.1.14示例:Salutation程序的连接
Java连接模型的例子如下面的Salutation程序: