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

Java中非实例化类的内存管理是如何工作的?,java,class,instantiation,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; } 这个类在内存中是如何表示为

下面是一段简单的Java代码:

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

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

class Box {
    int width;
    int height;
    int depth;
}
这个类在内存中是如何表示为对象的?在定义此类的步骤中,编译器是否在内存中创建有关此类的任何元信息

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

Box catBox = new Box();
正如您的代码所示,您可以创建类的对象,即使它没有任何构造函数定义,因为Java提供了默认构造函数。你会在下面的假设中找到更清楚的答案

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


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

是的,Java类也作为对象存储在分配给JVM的perm gen空间中。每个类也将有一个引用,它将处理这些方法。 如果您已经观察到许多问题,建议使用独立的静态方法,实际上只能在此perm gen空间中加载一次,并减少内存使用。 如果我们在一个类下使用相同的方法而不是静态的(尽管可以将其设置为静态的),那么我们将在内存中为相同的功能提供两个引用,因为它们是java类特有的。

您可能会感兴趣。