HotSpot虚拟机当中的元空间到底是包含了原有的方法区中的哪些数据呢?

HotSpot虚拟机当中的元空间到底是包含了原有的方法区中的哪些数据呢?

以下答案引用自GPT-3大模型,请合理使用:

片段。

HotSpot虚拟机将方法区改名为元空间,用于存放加载的常量池、字段和类、方法数据信息以及运行时常量池等。元空间中存储的内容而言,包括:

1. 加载的类型:比如类对象和接口对象,以及它们的成员变量和成员方法等;

2. 类和接口的常量池:它包含字面量和指向其他类和接口的引用等;

3. 方法数据:它包含被编译后的字节码、行号表等元数据;

4. 运行时常量池:它是在运行时动态生成的,包括编译期不能确定的常量,如动态加载的类和接口等。

下面是一段演示如何在元空间中存放数据的代码片段:

public class MetaspaceDemo {
    public static void main(String[] args) {
        // 定义某个类的Class对象
        Class<?> clazz = null;
        for (int i = 0; i < Integer.MAX_VALUE; ++i) {
            // 不断生成类的Class对象,并且放入元空间中
            clazz = MyGenerator.createClass(i);
        }
    }
}

如果我的回答解决了您的问题,请采纳我的回答

元空间是 Java 虚拟机规范中新增的概念,它是 JDK 8 中替代了永久代的概念。相比于永久代,元空间具有更好的灵活性和可扩展性,能够更好地适应 Java 应用程序的运行时内存需求。

元空间包含了原有的方法区中的以下数据:

  1. 类的元数据:元数据是描述类结构的数据,包括类名、父类、接口、字段、方法、注解等信息。在元空间中,每个类的元数据都会占用一定的内存空间,这些元数据被组织成为一个个的 Class 对象。
  2. 常量池:每个类都有一个常量池,其中存储了类中使用的常量,包括字符串、数字、符号引用等。在元空间中,每个类的常量池都会被保存下来。
  3. 静态变量和常量:在元空间中,每个类的静态变量和常量都会被保存下来,这些变量的值通常是在类加载时初始化的。
  4. 方法的字节码:在元空间中,每个类的方法字节码也会被保存下来,这些字节码被组织成一个个的 Method 对象。

需要注意的是,元空间中不包含实例对象的数据,因为这些数据是在堆内存中分配的,而不是在元空间中。同时,元空间中也不包含永久代中的一些数据结构,如 StringTable 和 ClassLoaderData 等。

元空间(Metaspace)是Java HotSpot虚拟机在JDK 8中引入的概念,取代了早期版本的永久代(PermGen)。

在HotSpot虚拟机中,元空间包含了类的元数据信息,包括类的名称、修饰符、字段、方法、注解等信息。与永久代不同,元空间中不包含运行时生成的类的实例数据,如字符串常量池等。

与永久代相比,元空间的最大好处是避免了永久代的一些限制和问题,如永久代的大小有限、内存不足会导致永久代溢出等。同时,元空间的大小可以动态调整,可以更好地适应应用程序的内存需求。

总之,元空间包含了类的元数据信息,是Java HotSpot虚拟机中的一个重要组成部分。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇文章讲的很详细,请看:HotSpot的启动过程
  • 除此之外, 这篇博客: HotSpot对象的创建过程中的 1.3 根据方法区中该类的信息,确定该类所需的内存大小 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    一个对象所需的内存大小,是在该对象所属的类被定义完就能确定的!且一个类所生产的所有对象的内存大小一样!

    JVM在一个类被加载进方法区时,就知该类生产的每个对象所需要的内存大小。

    从堆中划分一块对应大小的内存空间给新的对象,分配堆中的内存有两种方式:


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^