Java 8中的Java内存区域

Rus*_*lan 2 java memory jvm heap-memory metaspace

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

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

谢谢您的回答。

apa*_*gin 8

  1. 内存区域的结构是否取决于JVM的实现?

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

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

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

Java Heap的结构取决于所选的GC算法。例如,使用并行GC和CMS,堆分为老一代和年轻一代,后者由伊甸园和两个幸存者空间组成。

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

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

方法(静态和非静态)都驻留在JDK 8中的元空间中,或者驻留在JDK 8之前的PermGen中。在元空间中。

  1. 除了类元数据信息外,MetaSpace是否存储任何其他内容?

以下各项存储在Metaspace中:

  • 类(内部表示)
  • 符号(名称和签名)
  • 基本数组(例如,字段元数据表示为无符号短裤数组)
  • 方法及其字节码
  • 方法计数器
  • 常量池和CP缓存
  • 注解

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