java - 为什么JVM中的引用不占用两个堆栈槽
问题描述
查看 JVM 15 规范(此处为前两节),我看到
reference
,int
, 并且float
只占用一个局部变量槽和一个栈槽long
和double
, 占用 2 个插槽
规范点中的所有内容都表明插槽是 32 位宽的。如果是这样的话,当 JVM 堆非常大的时候怎么能工作呢?reference
难道 32 位还不足以解决潜在的海量堆问题吗?即使 JVM 对象的最小大小为 16 字节,32 位也会用完大约 70GB 堆的引用。
我“尝试”过的检查
只是为了检查上面在我本地安装的 64 位 Java 上是否仍然正确,这是一个示例 Java 类,用javac -target 8 me/alec/Tester.java
package me.alec;
public final class Tester {
public void intArgMethod(int intArg) { }
public void longArgMethod(long longArg) { }
public void referenceArgMethod(Tester referenceArg) { }
}
这是来自javap -v me.alec.Tester
. 请注意,areferenceArgMethod
本地大小等于referenceIntMethod
和小于referenceLongMethod
(所有方法的额外 +1 是由于this
引用参数)。
public void intArgMethod(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
stack=0, locals=2, args_size=2
0: return
LineNumberTable:
line 4: 0
public void longArgMethod(long);
descriptor: (J)V
flags: ACC_PUBLIC
Code:
stack=0, locals=3, args_size=2
0: return
LineNumberTable:
line 5: 0
public void referenceArgMethod(me.alec.Tester);
descriptor: (Lme/alec/Tester;)V
flags: ACC_PUBLIC
Code:
stack=0, locals=2, args_size=2
0: return
LineNumberTable:
line 6: 0
解决方案
推荐阅读
- java - 在 Java spring application.properties 中将 k8s 机密读取为 env 变量
- terraform - 如何从嵌套地图的特定键中获取列表?
- javascript - 使用cheerio 抓取表格的第n 个元素?
- node.js - Worker 无法查询/访问 Mongoose 模型
- parsing - 语法分析和语义分析有什么区别?
- java - 如何在android studio中从另一个类访问一个类的变量
- html - srcset 和下载图像
- reactjs - 在功能组件中传递减速器
- facebook - 为什么我们在将消息写入 facebook graph api 时得到“消息端点已被弃用”
- java - 具有 1 的最近单元格的距离