我已经阅读了很多有关Java内存区域的信息,但是看起来就像是一团糟。主要是由于在Java8中引入了新的MetaSpace
区域而不是PermGen
。现在有问题:
heap
在java8 +中包括哪些区域?static
方法和变量存储在java8和java8 +之前的位置?MetaSpace
是否存储除类元数据信息以外的任何内容?JVM
的实现?谢谢您的回答。
答案 0 :(得分:4)
- 内存区域的结构是否取决于JVM的实现?
绝对。 PermGen或Metaspace只是特定JVM的实现细节。以下答案是关于HotSpot JVM(Java SE虚拟机的参考实现)的。
- java8 +中堆包括哪些区域?
由于上述原因,用“在JDK 8中”而不是在“ Java 8中”来表达更为正确。
Java Heap的结构取决于所选的GC算法。例如。使用Parallel GC和CMS,堆分为老一代和年轻一代,后者由伊甸园和两个幸存者空间组成。
G1堆分为相同大小的区域。 Epsilon GC堆是单个整体区域。依此类推。
- 静态方法和变量存储在java8和java8 +之前的位置吗?
方法(静态和非静态)都位于JDK 8或JDK 8之前的PermGen中的Metaspace中。不确定“变量”是什么意思:字段值在Java Heap中,字段元数据(名称,类型,偏移量)在Metaspace中。
- MetaSpace是否存储除类元数据信息以外的任何内容?
以下各项存储在元空间中:
所有这些都可以视为“类元数据”。