关于 JVM 规范中引用大小的混淆

Confusion about the size of references in the JVM spec

JVM 规范声明引用只占用一个局部变量槽(jvms12 2.6.1)。此外,它指出 doublelong 占用两个局部变量槽,因为它们是 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 的字节码分析器不允许你这样做!