【问题标题】:Is Method area still present in Java 8?Java 8 中是否仍然存在方法区域?
【发布时间】:2018-10-14 06:00:20
【问题描述】:

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

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

在 Java 8 中,没有 Perm Gen,这意味着没有更多 “java.lang.OutOfMemoryError: PermGen”

这很好,但我也读过

方法区是 Perm Gen 中空间的一部分

但我似乎找不到任何明确表示方法区域在 Java 8 中不再存在的内容。

所以是 Perm Gen 连同 Method 区域被删除或只有 Perm Gen 得到 已删除,并且方法区域仍然存在于老年代。

请附上您可能看到的与 Java 8 内存模型相关的任何好的源材料

【问题讨论】:

  • 至少有一个Method Area in the spec
  • 我删除了 [memory-model] 标签,因为内存模型描述了线程与共享内存的交互,这与内存布局不同。

标签: java-8 jvm jvm-hotspot memory-layout


【解决方案1】:

由于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 对象已移至 Old Gen。由于方法区包含工件“例如运行时常量池、字段和方法数据,以及方法和构造函数的代码……”,在其他非 Java 对象(尽管池可能包含对堆对象的引用),它现在是元空间的一部分。

您现在可以讨论元空间是否是方法区域的实现,或者可能包含更多方法区域,但这没有实际意义。实际上,JVM 包含管理元空间及其包含的工件的代码,并且不需要关心这些工件在逻辑上是否属于规范所描述的“方法区域”。

【讨论】:

  • 真的同意你所说的,而且这个特定问题实际上可以成为讨论主题的点也是有效的,也许一个新的内存布局图像会让你更清楚地理解方法的概念面积。
  • 由于JVM规范中没有提到'Metapace',所以我认为HotSpot的实现与JVMS有点不同,有没有文章描述了HotSpot中的Run-Time Data Areas
  • @ericzhao wiki.openjdk.java.net/display/HotSpot 将是一个很好的起点
  • 在 -- new String("a") -- 中“a”字面量将存储在运行时常量池中是否正确,而运行时常量池又是元空间的一部分?那么堆上会有一个“a”值,而 Metascpace 中会有另一个“a”?
  • @user567068 不,对象总是存储在堆中,根据定义。答案包含指向定义堆的规范部分的链接。常量池只是一个由对象的引用组成的数据结构。因此,文字"a" 由堆内存中的String 对象表示,而常量池具有对它的引用,以确保包含相同文字的所有代码位置都将共享该对象。当您使用new String("a") 创建一个新字符串时,它也将存在于堆空间中。生成两个对象,但池中只引用了一个。
【解决方案2】:

这是 HotSpot VM In Java 8 的运行时数据存储

  • 已使用new 创建了所有对象,包括字符串常量池
  • 包含您的字段/实例变量

元空间(方法区)

  • 包含静态数据(类变量和静态方法)
  • 这里的数据可以被Heap、JVM stack访问

JVM 堆栈

  • 程序的当前执行情况。
  • 包含局部变量
  • 这是一个线程

本机堆栈

  • 用于本地方法执行,因为 Java 核心语言有一些本地内容
  • 也是一个线程

PC 寄存器/指令集

  • 保存堆栈中每个 JVM 指令的 JVM 内存地址(非本机地址)
  • 一般来说,JVM/native 栈中的每个入口都是指 PC 寄存器的地址,以便从 Heap/MetaSpace 中获取实际数据
  • 每个堆栈都与一个 PC 寄存器相关联

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2018-03-11
    • 2019-11-19
    • 2018-02-21
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多