Java 8中的Java内存区域

问题描述 投票:2回答:1

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

  1. heap在java8 +中包含哪些区域?
  2. 在java8和java8 +之前存储static方法和变量的位置?
  3. MetaSpace是否存储除类元数据信息之外的任何内容?
  4. 内存区域的结构是否依赖于JVM的实现?

谢谢您的回答。

java memory jvm heap-memory metaspace
1个回答
5
投票
  1. 内存区域的结构是否依赖于JVM的实现?

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

  1. 堆在java8 +中包含哪些区域?

由于上述原因,说“在JDK 8中”而不是“在Java 8中”更为正确。

Java Heap的结构取决于所选的GC算法。例如。通过并行GC和CMS,堆分为Old和Young代,后者由Eden和两个Survivor Spaces组成。

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

  1. 静态方法和变量存储在java 8和java 8之前的位置?

方法(静态和非静态)驻留在JDK 8中的Metaspace或JDK 8之前的PermGen中。不确定“变量”的含义:字段值在Java堆中,字段元数据(名称,类型,偏移)在Metaspace。

  1. MetaSpace是否存储除类元数据信息之外的任何内容?

以下项目存储在Metaspace中:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.