首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8中还存在方法区域吗?

Java 8中还存在方法区域吗?
EN

Stack Overflow用户
提问于 2018-05-03 20:16:50
回答 2查看 5.6K关注 0票数 16

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

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

使用Java 8,就没有PermGen,这意味着不再有“java.lang.OutOfMemoryError:PermGen”

这很好但我也读过

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

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

同样,随着方法区域的移除,或者只有Perm Gen被移除,方法区域在老一代中仍然存在。

请附上您可能见过的与Java 8内存模型相关的任何好的源代码

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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及其包含的工件的代码,并且不需要关心这些工件在逻辑上是否属于规范描述的“方法区域”。

票数 27
EN

Stack Overflow用户

发布于 2020-06-23 09:04:01

以下是Java8中HotSpot VM的运行时数据存储:

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

MetaSpace(方法区)

  • 包含静态数据(类变量和静态方法)
  • 这里的数据可由Heap、JVM堆栈访问。
  • 与<=Java7 PermGen不同,它使用JVM进程内存,而进程内存是有限的,不能在运行时进行扩展。MetaSpace使用本机内存

JVM堆栈

  • 当前正在执行的程序。
  • 包含局部变量
  • 是一根线

原生堆栈

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

PC寄存器/指令集

  • 保存堆栈中每个JVM指令的JVM内存地址(而不是本机地址)
  • 通常,JVM/本机堆栈中的每个条目都引用PC寄存器来获取从堆/元空间获取实际数据的地址。
  • 每个堆栈都与PC寄存器相关联。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50163218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档