这个问题在这里已有答案:
- Java接口......动态或静态内存? 3个答案
10941
2018-06-15 10:13
起源
堆,因为接口只作为类中的实现而存在,并且它们在堆上。 - Hiru
这纯粹是信息性的还是你想要实现某些目标? - Alex Taylor
这取决于JVM,因为JVM规范没有说明应该如何组织内存...... - assylias
无法找到....取决于JVM ......没有答案......即使在文档中...... - CoderNeji
接口中的所有值都是常量,即最终静态,因此它仅存储在Heap中。 - Hiru
答案:
警告: 正如@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();
}
关于的领域信息 calendar
和 myDate
存储在PermGen中,实际对象实例存储在Heap中。
在 Java8 PermGen被移动到Heap空间内,即所谓的Metaspace,所以你不会看到 java.lang.OutOfMemoryError: PermGen space
了。然而,元信息和对象分配存储器之间的概念分离仍然存在。
另请参阅@AlexTaylor规范报价。
7
2018-06-15 10:30
如评论所述,这是依赖于JVM的 - 例如,您声明的东西对于hostpot / Java 8来说是不正确的,因为根本不再存在Permgen ... - assylias
这仍然是热点JVM特有的。 - assylias
该 方法领域 (逻辑上是堆的一部分)在JVM中存储有关类和接口的大量信息:
...存储每类结构,例如运行时常量池,字段 和方法数据,以及方法和构造函数的代码,包括 类和实例初始化中使用的特殊方法(第2.9节) 和接口初始化。
然而:
本规范未规定方法区域的位置或 用于管理已编译代码的策略。
这意味着特定的JVM可以随意存储在任何地方。
6
2018-06-15 10:37