Java类文件规范声明:
代码数组给出实现该方法的Java虚拟机代码的实际字节。 当代码数组被读取到字节可寻址机器上的内存中时,如果数组的第一个字节在4字节边界上对齐,表开关和查找开关32位偏移将对齐4字节。(有关代码数组对齐的影响的更多信息,请参阅这些指令的说明。) (https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.3)
我该如何解释这句话呢?
这两个说明的维基百科页面提到了以下内容:(listings)
表--其他字节:
4+:0-3字节填充,defaultbyte1,defaultbyte2,defaultbyte3,defaultbyte4,lowbyte1,lowbyte2,lowbyte3,lowbyte4,highbyte1,highbyte2,highbyte3,highbyte4,跳转偏移.
查找切换额外字节:
4+:<0-3字节padding>,defaultbyte1,defaultbyte2,defaultbyte3,defaultbyte4,npairs1,npairs2,npairs3,npairs4,匹配偏移对.
我认为<0-3字节的padding>与类文件规范语句相关,我只是不知道具体情况如何。
发布于 2016-10-08 18:41:02
表开关和查找开关指令被定义为有0到3个字节的填充,这取决于它们在方法字节码中的偏移量。填充物的实际定义见第6.5节,其中列出了每条指令的格式。
在查找开关操作码之后,0到3个字节之间必须充当填充,这样defaultbyte1从当前方法的开始(其第一条指令的操作码)开始的地址是四个字节的倍数。
您突出强调的语句解释了这种设计选择的动机,否则可能会显得奇怪或毫无意义。
这样可以更有效地实现Java解释器,因为如果代码以4字节对齐地址加载,则可以通过对齐访问来读取开关表中的偏移量和键。
当然,现在它并不那么重要,因为我们有漂亮的JIT,但是在Java的早期,JVM很可能是作为一个简单的解释器实现的,这将在性能上产生很大的差异。
https://stackoverflow.com/questions/39935699
复制相似问题