Java 8中的Java内存区域

时间:2018-12-08 00:29:26

标签: java memory jvm heap-memory metaspace

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

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

谢谢您的回答。

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

G1堆分为相同大小的区域。 Epsilon GC堆是单个整体区域。依此类推。

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

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

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

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

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

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