首页 > 解决方案 > 为什么JVM中的引用不占用两个堆栈槽

问题描述

查看 JVM 15 规范(此处为前两节),我看到

规范点中的所有内容都表明插槽是 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

标签: javajvm

解决方案


推荐阅读