java 8 中的 Java 内存区域

标签 java memory jvm heap-memory metaspace

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

  1. java8+ 中 包括哪些区域?
  2. java8 和 java8+ 之前的静态方法和变量存储在哪里?
  3. MetaSpace 是否存储除类元数据信息之外的任何内容?
  4. 内存区域的结构是否取决于 JVM 的实现?

感谢您的回答。

最佳答案

  1. Does the structure of memory areas depend on the implementation of JVM ?

绝对是的。 PermGen 或 Metaspace 只是特定 JVM 的实现细节。以下回答是关于HotSpot JVM,Java SE虚拟机的引用实现。

  1. What areas does the heap include in java8+ ?

由于上述原因,说“在 JDK 8 中”比“在 Java 8 中”更正确。

Java堆的结构取决于所选的GC算法。例如。使用并行 GC 和 CMS,堆分为老代和年轻代,后者由 Eden 和两个 Survivor Space 组成。

G1堆被划分为相同大小的区域。 Epsilon GC 堆是一个单一的整体区域。等等。

  1. Where the static methods and variables are stored before java8 and java8+ ?

方法(静态和非静态)驻留在 JDK 8 中的 Metaspace 中或 JDK 8 之前的 PermGen 中。不确定“变量”是什么意思:字段值位于 Java 堆中,字段元数据(名称、类型) ,偏移量)位于元空间中。

  1. Does the MetaSpace store anything except class meta-data info ?

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

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

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

关于java 8 中的 Java 内存区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53678418/

相关文章:

java - 如何从Android Assets 中的文件夹创建文件?

Java 应用程序内存使用情况

java - 我的程序不允许我调用不同类的方法

java - maven install 如何安装和部署 *仅* ejb-client

java - Spring RestTemplate & Jackson - 日期转换?

javascript - 关于大型 JS 变量并将它们保留为 'in memory' 的经验法则?

在 C 中使用链表时控制内存

java - 未能创建 JVM; JVM 路径 C :\Program Files\Android\Android Studio\jre\jre

java - GC(分配失败)VS OutOfMemoryError 异常

java - 如何测量预编译java类的执行时间?