Java8 中方法区是否仍然存在?

Is Method area still present in Java 8?

在 Java8 之前,我们有 5 个主要的运行时数据区域:

  1. 方法区
  2. JVM 堆栈
  3. PC 寄存器
  4. 本机方法堆栈

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寄存器