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 提供了默认构造函数。您将在以下问题中找到更明确的答案
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.
这是 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 提供了默认构造函数。您将在以下问题中找到更明确的答案
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.