0

在jdk1.8+中,当MetaspaceTest类加载到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);
}
4

1 回答 1

0

首先,在 JLS 或 JVMS 中没有指定 Metaspace 和 String Table 之类的东西。它只是特定 JVM 的内部实现细节。例如,有完全兼容的 JVM 实现根本没有元空间。

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

  1. java.lang.String不,对象表示的实例"a"在 Java 堆中。只要"a"是强可达的,字符串表就包含对该对象的引用。
  2. 是的。
  3. ,运行时常量池包含JVMS §4.4中描述的内容。静态字段属于一个类镜像,它是java.lang.ClassJava Heap 中的一个实例。
  4. 同1。
  5. 元空间(正如“元”前缀所暗示的那样)包含类元数据,但不包含数据本身。例如,元空间包含该类MetaspaceTest有一个名为literalStrtype的字段的信息java.lang.String,但它与该字段的值无关。
  6. 是的。
  7. 不。如上所述,元空间只包含字段的描述,而不包含数据。实例字段的实际持有者是一个对象实例;静态字段的实际持有者是一个类镜像,即java.lang.Class堆中的实例。
于 2021-08-22T16:55:01.260 回答