在Java 8之前,我们有5个主要的运行时数据领域:
使用Java 8,就没有PermGen,这意味着不再有“java.lang.OutOfMemoryError:PermGen”
这很好但我也读过
方法区域是Perm Gen空间的一部分。
但是,我似乎找不到在Java 8中明确表示方法区域不再存在的任何东西。
同样,随着方法区域的移除,或者只有Perm Gen被移除,方法区域在老一代中仍然存在。
请附上您可能见过的与Java 8内存模型相关的任何好的源代码
发布于 2018-05-04 07:59:11
因为方法面积是规范中描述的一个逻辑概念,所以每个JVM都有一个方法区域,但这并不意味着它必须反映在实现代码中。同样,Java堆空间被指定为规范中的一个概念,用于存储所有Java对象,因此,所有Java对象都存储在每个定义的堆中,而不管它是如何实际实现的。
与Perm不同,Perm包含Java和Java以外的HotSpot数据结构,JavaJVMforJava8的内存布局具有明显的分离性。Old仍然只包含Java对象,而Metaspace只包含JVM特定的数据,而不包含Java对象。因此,以前存储在Perm中的Java对象已经被移动到了老Gen中,因为方法区域包含“运行时常量池、字段和方法数据,以及方法和构造函数…的代码”。换句话说,非Java对象(池可能包含对堆对象的引用),它现在是Metaspace的一部分。
现在您可以讨论Metaspace是方法区域的实现,还是可能包含更多的方法区域,但这没有实际意义。实际上,JVM包含管理Metaspace及其包含的工件的代码,并且不需要关心这些工件在逻辑上是否属于规范描述的“方法区域”。
发布于 2020-06-23 09:04:01
以下是Java8中HotSpot VM的运行时数据存储:
堆
new创建了所有对象,包括字符串常量池。MetaSpace(方法区)
JVM堆栈
原生堆栈
PC寄存器/指令集
https://stackoverflow.com/questions/50163218
复制相似问题