在Java 8之前,我们有5个主要的运行时数据区域:
使用Java 8,没有Perm Gen,这意味着不再有“java.lang.OutOfMemoryError:PermGen”
这很棒,但我也读过
方法区域是Perm Gen中空间的一部分
但我似乎无法找到任何明确说明方法区域在Java 8中不再存在的东西。
因此Perm Gen以及方法区域被移除或者只有Perm Gen被删除而且旧方代仍然存在方法区域。
请附上您可能已经看到的与Java 8 Memory Model相关的任何好的源材料
由于Method Area是规范中描述的逻辑概念,因此每个JVM都有一个方法区域,但这并不意味着它必须反映在实现代码中。同样,Java Heap Space在规范中被指定为概念,作为所有Java对象的存储,因此所有Java对象都按照定义存储在堆中,而不管它是如何实际实现的。
与包含除Java对象之外的Java对象和JVM数据结构的Perm Gen不同,HotSpot JVM for Java 8的内存布局具有明显的分离。 Old Gen仍然只包含Java对象,而Metaspace只包含JVM特定数据而不包含Java对象。因此以前存储在Perm Gen中的Java对象已被移动到旧Gen.由于方法区域包含工件“诸如运行时常量池,字段和方法数据,以及方法和构造函数的代码......”,在其他单词非Java对象(池可能包含对堆对象的引用),它现在是Metaspace的一部分。
您现在可以讨论Metaspace是方法区域的实现还是可能包含多个方法区域,但这没有实际意义。实际上,JVM包含用于管理元空间及其包含的工件的代码,并且不需要关心这些工件在逻辑上是否属于规范描述为“方法区域”的内容。