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

时间:2015-06-15 10:13:56

标签: java interface jvm abstract-class

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

2 个答案:

答案 0 :(得分: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();
}

有关calendarmyDate的字段信息存储在PermGen中,而实际对象实例存储在堆中。

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

同时查看@AlexTaylor规范报价。

答案 1 :(得分:6)

method area(逻辑上是堆的一部分)在JVM中存储了很多关于类和接口的信息:

  

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

但是:

  

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

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