首页 > 解决方案 > 对 JVM 规范中引用大小的困惑

问题描述

JVM 规范声明引用只占用一个局部变量槽(jvms12 2.6.1)。此外,它指出doublelong占用两个局部变量槽,因为它们是 64 位的。

这是否意味着所有 JVM 兼容的实现都必须使用 32 位寻址?64 位 JVM 如何处理这个问题?他们是使用 64 位局部变量插槽,还是使用 2 个插槽作为参考?

标签: javajvmspecifications

解决方案


这是否意味着所有 JVM 兼容的实现都必须使用 32 位寻址?64 位 JVM 如何处理这个问题?他们是使用 64 位局部变量插槽,还是使用 2 个插槽作为参考?

不。

插槽是一种抽象,其目的是允许指定字节码的行为。JVM 解释器和 JIT 编译器做了一些巧妙的事情来将插槽映射到虚拟内存地址。这些映射考虑到引用可能是 32 位或 64 位地址(或 32 位压缩 OOP)这一事实

无论指针的实际大小如何,一个(抽象)槽用于引用。

问:他们为什么要这样定义插槽?

A:这样相同的字节码在 32 位和 64 位 Java 平台上具有相同的含义!

问:如果您尝试将插槽的内容视为不同的类型,为什么它不会崩溃?

A:因为 JVM 的字节码分析器不会让你这样做!


推荐阅读