抽象 class 和接口在 JVM 中的存储方面有什么区别
What is the difference between abstract class and interface in terms of their storage in JVM
抽象 class 和接口在 JVM 中的存储方面有什么区别。更准确地说,JVM 将接口存储在其内存中的什么位置?
警告:正如@assylias 所提到的,此机制特定于 Oracle HotSpot JVM。
之前Java8
抽象 classes 和接口的所有元信息都存储在 PermGen 中。元信息仅包括 class 特定信息(它有哪些字段、父项是什么等)。
接口只能有public static final
个字段,所以这个字段元信息存储在PermGen中。
摘要class 可以同时具有静态和非静态字段。但是在元信息上没有区别,所以也都存储在PermGen中。另一方面,对于静态和非静态字段,真实对象实例都存储在堆中。
看例子
public class MyClass {
public static final Calendar calendar = Calendar.getInstance();
private Date myDate = new Date();
}
关于calendar
和myDate
的字段信息存储在PermGen中,真正的对象实例存储在Heap中。
在Java8 中,PermGen 被移动到堆中 space,在所谓的 Metaspace 中,所以你不会看到 java.lang.OutOfMemoryError: PermGen space
了。但是,元信息和对象分配内存之间的概念分离仍然存在。
另请查看@AlexTaylor 规范引用。
method area(逻辑上是堆的一部分)存储了很多关于类的信息和JVM中的接口:
...stores per-class structures such as the run-time constant pool, field
and method data, and the code for methods and constructors, including
the special methods (§2.9) used in class and instance initialization
and interface initialization.
但是:
This specification does not mandate the location of the method area or
the policies used to manage compiled code.
这意味着特定的 JVM 可以随意将它们存储在任何地方。
抽象 class 和接口在 JVM 中的存储方面有什么区别。更准确地说,JVM 将接口存储在其内存中的什么位置?
警告:正如@assylias 所提到的,此机制特定于 Oracle HotSpot JVM。
之前Java8
抽象 classes 和接口的所有元信息都存储在 PermGen 中。元信息仅包括 class 特定信息(它有哪些字段、父项是什么等)。
接口只能有public static final
个字段,所以这个字段元信息存储在PermGen中。
摘要class 可以同时具有静态和非静态字段。但是在元信息上没有区别,所以也都存储在PermGen中。另一方面,对于静态和非静态字段,真实对象实例都存储在堆中。
看例子
public class MyClass {
public static final Calendar calendar = Calendar.getInstance();
private Date myDate = new Date();
}
关于calendar
和myDate
的字段信息存储在PermGen中,真正的对象实例存储在Heap中。
在Java8 中,PermGen 被移动到堆中 space,在所谓的 Metaspace 中,所以你不会看到 java.lang.OutOfMemoryError: PermGen space
了。但是,元信息和对象分配内存之间的概念分离仍然存在。
另请查看@AlexTaylor 规范引用。
method area(逻辑上是堆的一部分)存储了很多关于类的信息和JVM中的接口:
...stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization.
但是:
This specification does not mandate the location of the method area or the policies used to manage compiled code.
这意味着特定的 JVM 可以随意将它们存储在任何地方。