首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java程序的内存区域?

Java程序的内存区域?
EN

Stack Overflow用户
提问于 2020-03-02 17:25:09
回答 2查看 416关注 0票数 3

我还没有深入探讨Java在程序运行时是如何对待内存的,就像我在应用程序级别上所做的那样。最近,由于应用程序的性能问题,我需要知道一个实例。

我已经注意到内存中的“堆栈”、“堆”区域,我认为这是Java程序的模型。然而,事实证明,这是更多,而且更多。

例如,我遇到了这样的术语:伊甸园、s0、s1、旧内存等等。我以前从来不知道这些术语。

由于Java正在/一直在变化,所以这些术语在Java 8中是/不相关的。

有人能指导我们从哪里获得这些信息吗?在什么情况下我们需要了解这些信息?是主存的这一部分,即内存

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-02 17:42:50

Java语言规范与Java虚拟机规范定义的Java讨论了堆栈(以及方法面积)。

在概念上,这些都是需要描述的东西,它们构成了Java虚拟机。

如果您想要实现JVM,就需要以某种方式实现这些功能。它们在Java 13中和它们回到Java 1中一样有效,它们的工作方式并没有从根本上改变。

你提到的其他术语(以及“旧一代”、“新一代”、.)是用于实现特定的垃圾收集机制的内存区域,特别是在Oracle / OpenJDK中实现的内存区域。

所有这些区域基本上都是堆的特定部分。堆被划分到这些区域的确切方式是由垃圾收集器来决定,并且了解它们不应该是必要的,除非您想要调整垃圾收集器。

由于垃圾收集器在发行版之间发生变化,而新的垃圾收集器方法是定期实现的(因为这是加快JVM的主要方法之一),所以这里使用的具体术语将随着时间的推移而改变。

票数 3
EN

Stack Overflow用户

发布于 2020-03-02 17:36:48

Eden、s0、s1、旧内存和其他内存区域仅存在于特定垃圾收集器实现的上下文中,例如,像G1这样的代回收器将堆划分为提到的区域,而像ZGC这样的非分代收集器则不会。

首先回顾JVM中的主要垃圾收集器:

  • ParNew
  • CMS
  • G1
  • ZGC / Shenandoah / Azul C4

然后试着理解相关的概念:

  • 线程-本地分配缓冲区(TLAB)
  • 逃逸分析
  • 字符串常量池,字符串实习生,字符串去复制
  • 永久一代对Metaspace
  • 对象布局,例如为什么boolean不使用1位(字撕裂)
  • 本机内存,例如JNI或离堆内存访问

我不相信有一个网站可以解释完整的JVM内存管理方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60493804

复制
相关文章

相似问题

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