我已经阅读了很多关于 java 内存区域的内容,但看起来它只是一团糟。主要是由于引入了一个新MetaSpace
区域而不是PermGen
在 java8 中。现在有问题:
heap
java8+中包含哪些区域?static
方法和变量在 java8 和 java8+ 之前存储在哪里?MetaSpace
除了类元数据信息之外,是否存储任何内容?- 内存区域的结构是否取决于实现
JVM
?
谢谢您的回答。
我已经阅读了很多关于 java 内存区域的内容,但看起来它只是一团糟。主要是由于引入了一个新MetaSpace
区域而不是PermGen
在 java8 中。现在有问题:
heap
java8+中包含哪些区域?static
方法和变量在 java8 和 java8+ 之前存储在哪里?MetaSpace
除了类元数据信息之外,是否存储任何内容?JVM
?谢谢您的回答。
- 内存区域的结构是否取决于 JVM 的实现?
绝对地。PermGen 或 Metaspace 只是特定 JVM 的实现细节。以下答案是关于 HotSpot JVM,Java SE 虚拟机的参考实现。
- java8+ 中的堆包括哪些区域?
由于上述原因,说“在 JDK 8 中”而不是“在 Java 8 中”会更正确。
Java Heap 的结构取决于选择的 GC 算法。例如,使用 Parallel GC 和 CMS,堆被分为老年代和年轻代,后者由 Eden 和两个 Survivor Spaces 组成。
G1 Heap 被划分为相同大小的区域。Epsilon GC 堆是一个单一的整体区域。等等。
- 静态方法和变量在 java8 和 java8+ 之前存储在哪里?
方法(静态和非静态)驻留在 JDK 8 中的 Metaspace 或 JDK 8 之前的 PermGen 中。不确定您所说的“变量”是什么意思:字段值在 Java Heap 中,字段元数据(名称、类型、偏移量)在元空间中。
- MetaSpace 是否存储类元数据信息以外的任何内容?
以下项目存储在元空间中:
所有这些都可以被认为是“类元数据”。