Java8 中方法区是否仍然存在?
Is Method area still present in Java 8?
在 Java8 之前,我们有 5 个主要的运行时数据区域:
- 方法区
- 堆
- JVM 堆栈
- PC 寄存器
- 本机方法堆栈
With Java 8, there is no Perm Gen, that means there is no more
“java.lang.OutOfMemoryError: PermGen”
很棒,但我也读过
Method Area is part of space in the Perm Gen
但我似乎找不到任何明确说明 Java 8 中不再有方法区的内容。
So is Perm Gen along with Method area got removed or only Perm Gen got
removed and Method area is still present in old generation.
请附上您可能见过的与 Java 8 内存模型
相关的任何好的来源 material
由于Method Area is a logical concept described in the specification, every JVM has a Method Area, though that doesn’t imply that it has to be reflected in the implementation code. Likewise, the Java Heap Space在规范中被指定为一个概念,作为所有Java对象的存储,因此所有Java对象都存储在Heap中,根据定义,不管它实际是如何实现的。
与包含 Java 对象和 Java 对象以外的 JVM 数据结构的 Perm Gen 不同,Java 8 的 HotSpot JVM 内存布局有明显的分离。 Old Gen 仍然只包含 Java 个对象,而 Metaspace 只包含 JVM 特定数据,没有 Java 个对象。因此 Java 以前存储在 Perm Gen 中的对象已移至 Old Gen。由于方法区包含工件“例如 运行-时间常量池、字段和方法数据以及方法和构造函数……”,换句话说,非 Java 对象(尽管池可能包含 对堆对象的引用 ),它现在是元空间的一部分。
您现在可以讨论 Metaspace 是 Method Area 的实现还是可能包含的不仅仅是 Method Area,但这没有实际意义。实际上,JVM 包含管理元空间及其包含的工件的代码,并且不需要关心这些工件在逻辑上是否属于规范描述的“方法区”。
这里是 HotSpot VM 的运行时数据存储 In Java 8
堆
- 已获取使用
new
创建的所有对象,包括字符串常量池
- 包含您的 fields/instance 个变量
元空间(方法区)
- 包含静态数据(Class 变量和静态方法)
- 堆、JVM 栈可以访问这里的数据
- 与 <=Java7 PermGen 不同,PermGen 占用有限的 JVM 进程内存,无法在运行时扩展。 MetaSpace 使用本机内存
JVM 堆栈
- 您的程序的当前执行。
- 包含局部变量
- 这是一个线程
本机堆栈
- 用于本地方法执行,因为Java核心语言有一些本地的东西
- 也是一个线程
PC 寄存器/指令集
- 保存堆栈中每条 JVM 指令的 JVM 内存地址(非本机地址)
- 通常 JVM/native 堆栈中的每个条目都引用 PC 寄存器的地址以从 Heap/MetaSpace
获取实际数据
- 每个栈都关联一个PC寄存器
在 Java8 之前,我们有 5 个主要的运行时数据区域:
- 方法区
- 堆
- JVM 堆栈
- PC 寄存器
- 本机方法堆栈
With Java 8, there is no Perm Gen, that means there is no more “java.lang.OutOfMemoryError: PermGen”
很棒,但我也读过
Method Area is part of space in the Perm Gen
但我似乎找不到任何明确说明 Java 8 中不再有方法区的内容。
So is Perm Gen along with Method area got removed or only Perm Gen got removed and Method area is still present in old generation.
请附上您可能见过的与 Java 8 内存模型
相关的任何好的来源 material由于Method Area is a logical concept described in the specification, every JVM has a Method Area, though that doesn’t imply that it has to be reflected in the implementation code. Likewise, the Java Heap Space在规范中被指定为一个概念,作为所有Java对象的存储,因此所有Java对象都存储在Heap中,根据定义,不管它实际是如何实现的。
与包含 Java 对象和 Java 对象以外的 JVM 数据结构的 Perm Gen 不同,Java 8 的 HotSpot JVM 内存布局有明显的分离。 Old Gen 仍然只包含 Java 个对象,而 Metaspace 只包含 JVM 特定数据,没有 Java 个对象。因此 Java 以前存储在 Perm Gen 中的对象已移至 Old Gen。由于方法区包含工件“例如 运行-时间常量池、字段和方法数据以及方法和构造函数……”,换句话说,非 Java 对象(尽管池可能包含 对堆对象的引用 ),它现在是元空间的一部分。
您现在可以讨论 Metaspace 是 Method Area 的实现还是可能包含的不仅仅是 Method Area,但这没有实际意义。实际上,JVM 包含管理元空间及其包含的工件的代码,并且不需要关心这些工件在逻辑上是否属于规范描述的“方法区”。
这里是 HotSpot VM 的运行时数据存储 In Java 8
堆
- 已获取使用
new
创建的所有对象,包括字符串常量池 - 包含您的 fields/instance 个变量
元空间(方法区)
- 包含静态数据(Class 变量和静态方法)
- 堆、JVM 栈可以访问这里的数据
- 与 <=Java7 PermGen 不同,PermGen 占用有限的 JVM 进程内存,无法在运行时扩展。 MetaSpace 使用本机内存
JVM 堆栈
- 您的程序的当前执行。
- 包含局部变量
- 这是一个线程
本机堆栈
- 用于本地方法执行,因为Java核心语言有一些本地的东西
- 也是一个线程
PC 寄存器/指令集
- 保存堆栈中每条 JVM 指令的 JVM 内存地址(非本机地址)
- 通常 JVM/native 堆栈中的每个条目都引用 PC 寄存器的地址以从 Heap/MetaSpace 获取实际数据
- 每个栈都关联一个PC寄存器