JVM规范指出,引用仅占用一个局部变量插槽(jvms12 2.6.1)。此外,它指出double
和long
占用两个局部变量插槽,因为它们是64位的。
这是否意味着所有符合JVM的实现都必须使用32位寻址? 64位JVM如何处理此问题?他们使用64位局部变量插槽还是使用2个插槽作为参考?
答案 0 :(得分:3)
这是否意味着所有符合JVM的实现都必须使用32位寻址? 64位JVM如何处理此问题?他们使用64位局部变量插槽还是使用2个插槽作为参考?
不。
插槽是一种抽象,其目的是允许指定字节码的行为。 JVM解释器和JIT编译器做了一些聪明的事情,将插槽映射到虚拟内存地址。这些映射考虑到引用可能是32或64位地址(或32位压缩OOP)的事实
一个(抽象)插槽用于引用指针的实际大小。
问:为什么他们要这样定义广告位?
A:因此,相同的字节码在32位和64位Java平台上具有相同的含义!
问:如果您尝试将某个插槽的内容视为另一种类型,为什么它不会崩溃?
A:因为JVM的字节码分析器不允许您这样做!