内存管理如何适用于Java中的非实例化类?

时间:2017-03-25 06:31:44

标签: java class instantiation

以下是Java中的一小段代码:

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

Box catBox = new Box();

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

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

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

3 个答案:

答案 0 :(得分:3)

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

Java类元数据结构通常表示为GL_ALPHA,您可以查看here以获取更多详细信息。

答案 1 :(得分:0)

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

Box catBox = new Box();

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

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

答案 2 :(得分:0)

是Java类也作为对象存储在分配给JVM的perm-gen空间内。每个类都有一个引用,它将负责这些方法。 如果您观察到许多人建议使用独立的静态方法,这些方法实际上只能在此perm-gen空间中加载一次并减少内存使用量。 如果我们在类而不是静态下使用相同的方法(尽管可以使其成为静态),我们最终会在内存中有两个引用,它们具有与java类相同的功能。