java - 对 JVM 规范中引用大小的困惑
问题描述
JVM 规范声明引用只占用一个局部变量槽(jvms12 2.6.1)。此外,它指出double
和long
占用两个局部变量槽,因为它们是 64 位的。
这是否意味着所有 JVM 兼容的实现都必须使用 32 位寻址?64 位 JVM 如何处理这个问题?他们是使用 64 位局部变量插槽,还是使用 2 个插槽作为参考?
解决方案
这是否意味着所有 JVM 兼容的实现都必须使用 32 位寻址?64 位 JVM 如何处理这个问题?他们是使用 64 位局部变量插槽,还是使用 2 个插槽作为参考?
不。
插槽是一种抽象,其目的是允许指定字节码的行为。JVM 解释器和 JIT 编译器做了一些巧妙的事情来将插槽映射到虚拟内存地址。这些映射考虑到引用可能是 32 位或 64 位地址(或 32 位压缩 OOP)这一事实
无论指针的实际大小如何,一个(抽象)槽用于引用。
问:他们为什么要这样定义插槽?
A:这样相同的字节码在 32 位和 64 位 Java 平台上具有相同的含义!
问:如果您尝试将插槽的内容视为不同的类型,为什么它不会崩溃?
A:因为 JVM 的字节码分析器不会让你这样做!
推荐阅读
- java - 在 ActiveMQ Artemis 上配置 TLS
- android - 迭代项目数量,自定义适配器
- javascript - 当儿童有“显示:无”时隐藏.card-body
- linux - 简单的 bash 问题,-gt:一元运算符预期错误
- docker - 如何在 MacBook 上为 Docker 使用 NFS 挂载
- c# - 将新表单添加到项目 - Windows 表单应用程序 C#(使用 Macbook)
- nestjs - 企业代理背后的 NestJS HttpModule 使用
- c++ - 是否有统一函数类型限定符和简化可恶函数类型的建议?
- python - Pyspark 中出现错误 - TypeError: 'list' object is not callable
- typescript - 如何在 React 导航 5x 中定义导航属性类型