关于 JVM 规范中引用大小的混淆
Confusion about the size of references in the JVM spec
JVM 规范声明引用只占用一个局部变量槽(jvms12 2.6.1)。此外,它指出 double
和 long
占用两个局部变量槽,因为它们是 64 位的。
这是否意味着所有符合 JVM 的实现都必须使用 32 位寻址? 64 位 JVM 如何处理这个问题?他们使用 64 位局部变量槽,还是使用 2 个槽作为引用?
Does this mean that all JVM compliant implementations must use 32-bit addressing? How do 64-bit JVMs handle this? Do they use 64 bit local variable slots, or do they use 2 slots for references?
没有。
槽是一种抽象,其目的是允许指定字节码的行为。 JVM 解释器和 JIT 编译器做了一些聪明的事情来将槽映射到虚拟内存地址。这些映射考虑到引用可能是 32 位或 64 位地址(或 32 位压缩 OOP)
一个(抽象)槽用于参考与指针的实际大小无关。
问:他们为什么要这样定义插槽?
答:所以相同的字节码在32位和64位Java平台上具有相同的含义!
问:如果您尝试将插槽中的内容视为不同类型,为什么它不会分崩离析?
A:因为 JVM 的字节码分析器不允许你这样做!
JVM 规范声明引用只占用一个局部变量槽(jvms12 2.6.1)。此外,它指出 double
和 long
占用两个局部变量槽,因为它们是 64 位的。
这是否意味着所有符合 JVM 的实现都必须使用 32 位寻址? 64 位 JVM 如何处理这个问题?他们使用 64 位局部变量槽,还是使用 2 个槽作为引用?
Does this mean that all JVM compliant implementations must use 32-bit addressing? How do 64-bit JVMs handle this? Do they use 64 bit local variable slots, or do they use 2 slots for references?
没有。
槽是一种抽象,其目的是允许指定字节码的行为。 JVM 解释器和 JIT 编译器做了一些聪明的事情来将槽映射到虚拟内存地址。这些映射考虑到引用可能是 32 位或 64 位地址(或 32 位压缩 OOP)
一个(抽象)槽用于参考与指针的实际大小无关。
问:他们为什么要这样定义插槽?
答:所以相同的字节码在32位和64位Java平台上具有相同的含义!
问:如果您尝试将插槽中的内容视为不同类型,为什么它不会分崩离析?
A:因为 JVM 的字节码分析器不允许你这样做!