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 应用程序的运行时内存需求。
元空间包含了原有的方法区中的以下数据:
需要注意的是,元空间中不包含实例对象的数据,因为这些数据是在堆内存中分配的,而不是在元空间中。同时,元空间中也不包含永久代中的一些数据结构,如 StringTable 和 ClassLoaderData 等。
元空间(Metaspace)是Java HotSpot虚拟机在JDK 8中引入的概念,取代了早期版本的永久代(PermGen)。
在HotSpot虚拟机中,元空间包含了类的元数据信息,包括类的名称、修饰符、字段、方法、注解等信息。与永久代不同,元空间中不包含运行时生成的类的实例数据,如字符串常量池等。
与永久代相比,元空间的最大好处是避免了永久代的一些限制和问题,如永久代的大小有限、内存不足会导致永久代溢出等。同时,元空间的大小可以动态调整,可以更好地适应应用程序的内存需求。
总之,元空间包含了类的元数据信息,是Java HotSpot虚拟机中的一个重要组成部分。
不知道你这个问题是否已经解决, 如果还没有解决的话:一个对象所需的内存大小,是在该对象所属的类被定义完就能确定的!且一个类所生产的所有对象的内存大小一样!
JVM在一个类被加载进方法区时,就知该类生产的每个对象所需要的内存大小。
从堆中划分一块对应大小的内存空间给新的对象,分配堆中的内存有两种方式: