抽象类和接口在JVM中的存储有什么区别

Sha*_*wal 11 java abstract-class jvm interface

抽象类和接口在JVM中的存储有什么区别.更准确地说,JVM将接口存储到其内存中的哪个位置?

Ada*_*ker 7

警告:正如@assylias所提到的,这种机制特定于Oracle HotSpot JVM.

在Java8之前

对于抽象类和接口,所有元信息都存储在PermGen中.元信息仅包括特定于类的信息(它具有哪些字段,父母是什么等).

接口只能有public static final字段,因此该字段元信息存储在PermGen中.

抽象类可以同时具有静态和非静态字段.但是,元信息方面没有区别,因此它也存储在PermGen中.另一方面,真实对象实例存储在Heap中,用于静态和非静态字段.

查看示例

public class MyClass {
   public static final Calendar calendar = Calendar.getInstance();
   private Date myDate = new Date();
}
Run Code Online (Sandbox Code Playgroud)

关于calendarmyDate存储在PermGen中的字段信息和实际对象实例存储在Heap中.

Java8中, PermGen被移动到Heap空间内,即所谓的Metaspace中,因此您将不再看到它java.lang.OutOfMemoryError: PermGen space.然而,元信息和对象分配存储器之间的概念分离仍然存在.

另请参阅@AlexTaylor规范报价.


Ale*_*lor 6

方法区(堆的逻辑部分)存储了很多关于在JVM的类和接口的信息:

...存储每类结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化和接口初始化中使用的特殊方法(第2.9节).

然而:

本规范未规定方法区域的位置或用于管理编译代码的策略.

这意味着特定的JVM可以随意将它们存储在任何地方.