Java 中的非实例化 类 的内存管理是如何工作的?

How is the memory management works for non-instantiated classes in Java?

这是 Java 中的一段简单代码:

class Box {
    int width;
    int height;
    int depth;
}

Box catBox = new Box();

当执行构造函数 Box() 时,我们将获得 Box class 的一个实例。问题是 - 编译器在实例化之前在代码中遇到此 class 时如何表现?我的意思是,这部分:

class Box {
    int width;
    int height;
    int depth;
}

这个 class 在内存中如何表示为一个对象?编译器是否在定义这样的 class 的步骤中在内存中创建关于此 class 的任何元信息?

class Box {
    int width;
    int height;
    int depth;
}

Box catBox = new Box();

如您的代码所示,您可以创建 class 的对象,即使它没有任何构造函数定义,因为 Java 提供了默认构造函数。您将在以下问题中找到更明确的答案

https://softwareengineering.stackexchange.com/questions/257938/why-is-there-no-default-constructor-generated-if-you-define-an-explicit-construc

Java classes(元数据)将存储在 perm-gen 内存中 space(在 Java8 中,这是 Metaspace) ,其中包含 classes、方法等的名称。

Java class 元数据结构通常表示为 klass,您可以查看 here 了解更多详细信息。

是 Java classes 也作为对象存储在分配给 JVM 的 perm-gen space 中。每个 class 也将有一个参考,它将处理这些方法。 如果您观察到许多建议使用独立的静态方法,这些方法实际上只能在此 perm-gen space 中加载一次并减少内存使用。 如果我们在 class 而不是 static 下使用相同的方法(尽管可以将其设为静态),我们最终将在内存中有两个引用以实现相同的功能,因为它们是 java class.