Java 8 中的 Java 内存区域

Posted

技术标签:

【中文标题】Java 8 中的 Java 内存区域【英文标题】:Java memory areas in java 8 【发布时间】:2019-05-09 17:52:20 【问题描述】:

我已经阅读了很多关于 java 内存区域的内容,但看起来它只是一团糟。主要是由于在 java8 中引入了一个新的MetaSpace 区域而不是PermGen。现在有问题:

    heap 在 java8+ 中包括哪些区域? static 方法和变量在 java8 和 java8+ 之前存储在哪里? MetaSpace 是否存储类元数据信息以外的任何内容? 内存区域的结构是否依赖于JVM的实现?

感谢您的回答。

【问题讨论】:

将您的问题之一输入 Google:***.com/questions/27131165/… What is the difference between PermGen and Metaspace?的可能重复 #4 绝对。内存区域完全由 JVM 实现定义。 【参考方案1】:
    内存区域的结构是否依赖于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 是否存储类元数据信息以外的任何内容?

以下项目存储在元空间中:

类(它们的内部表示) 符号(名称和签名) 原始数组(例如,字段元数据表示为无符号短数组) 方法及其字节码 方法计数器 常量池和 CP 缓存 注释

所有这些都可以被认为是“类元数据”。

【讨论】:

以上是关于Java 8 中的 Java 内存区域的主要内容,如果未能解决你的问题,请参考以下文章

Java内存区域详解

Java8-JVM内存区域划分白话解读

面试题之Java内存区域

面试题之Java内存区域

JVM基础和内存区域剖析

JVM笔记— Java 内存区域详解