在 jdk 1.8+ 中,元空间如何布局 class 信息?

In jdk 1.8+, how metaspace layout the class info?

在jdk1.8+中,当MetaspaceTest class加载到jvm时,这是我对内存布局的理解,对吗?

public class MetaspaceTest {
    /* 
     1. "a" would be interned into the global String Table of heap;
     2. object created by [new String("a")] would be placed in heap;
     3. constant STR_OBJ would be placed in the constant-pool of MetaspaceTest class info, 
        and pointing to the string object created by [new String("a")];
    */
    private final static String STR_OBJ = new String("a");
    /* 
     4. "b" would be interned in the global String Table of heap;
     5. static field literalStr would be placed in metaspace, 
       and pointing to the string "b" which is interned into the global String Table of heap;
    */
    private static String literalStr = "b";
    /*
     6. object created by [new Integer(8)] would be placed in heap;
     7. static field intNum would be placed in metaspace, 
       and pointing to the object created by [new Integer(8)];
    */
    private static Integer intNum = new Integer(8);
}

首先,像Metaspace 和String Table 这样的东西在JLS 或JVMS 中都没有规定。它完全是特定 JVM 的内部实现细节。例如,完全兼容的 JVM 实现完全没有元空间。

如果我们谈论现代 HotSpot JVM,您的理解不太正确。

  1. 没有。表示 "a"java.lang.String 对象实例位于 Java 堆中。只要 "a" 是强可达的,字符串 table 就包含对该对象的引用。
  2. 是的。
  3. 没有。 Run-Time Constant Pool holds things described in JVMS §4.4。静态字段属于class镜像,它是Java堆中java.lang.Class的一个实例。
  4. 同1.
  5. 元空间(如“元”前缀所示)包含 ,但不包含数据本身。例如。元空间包含以下信息:class MetaspaceTest 有一个名为 literalStr 且类型为 java.lang.String 的字段,但它与该字段的值无关。
  6. 是的。
  7. 没有。如上所述,元空间只包含字段的描述,不包含数据。实例字段的实际持有者是一个对象实例;静态字段的实际持有者是一个 class 镜像,即堆中 java.lang.Class 的实例。