首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java GC:为什么有两个幸存区域?

Java GC:为什么有两个幸存区域?
EN

Stack Overflow用户
提问于 2012-05-22 11:17:05
回答 7查看 34.9K关注 0票数 83

对于Sun/Oracle的JVM,我读到过GC算法将新一代划分为一个伊甸园区域和两个幸存区域。我想知道的是,为什么是两个幸存区域而不是一个?算法可以在伊甸园和一个幸存区域之间保持乒乓连接(就像它目前在两个幸存区域之间所做的那样);或者这种方法有什么缺点吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-05-22 11:37:35

我相信JRockit的GC实现更像你建议的那样工作,只有一个伊甸园和一个幸存者空间,但不要引用我的话。

HotSpot JVM有两个生存者空间的原因是为了减少处理碎片的需要。在eden空间中分配新对象。一切都很好。当它被填满时,你需要一个GC,所以杀死陈旧的对象,并将活的对象移动到一个幸存空间,在那里它们可以成熟一段时间,然后被提升到老一代。到目前为止还不错。然而,下一次我们用完伊甸园空间时,我们就会遇到一个难题。下一个GC会清空eden和survivor空间中的一些空间,但这些空间不是连续的。所以是不是更好

  1. 尝试将来自伊甸园的幸存者放入由GC清理的幸存者空间的空洞中?
  2. 将幸存者空间中的所有对象向下移动以消除碎片,然后将幸存者移入其中?
  3. 只需说“去它吧,我们无论如何都会移动所有东西”,并将两个空间中的所有幸存者复制到一个完全独立的空间中--第二个幸存者空间--从而为您留下一个干净的伊甸园和幸存者空间,在那里您可以在下一个GC上重复该序列?

Sun对这个问题的回答是显而易见的。

票数 85
EN

Stack Overflow用户

发布于 2013-01-17 00:11:45

在一个次要的垃圾收集的操作之后,两个幸存空间的角色颠倒了过来

两个幸存者空间。这些对象至少在一次小型垃圾回收中幸存下来,但在升级到老一代之前,又有机会变得不可访问。它们中只有一个包含对象,而另一个大部分时间都是未使用的。

在次要垃圾收集操作期间,将标记已被发现为垃圾的对象。在收集中幸存下来的伊甸园中的活对象被复制到未使用的幸存者空间。正在使用的幸存者空间中的活动对象也被复制到未使用的幸存者空间,这些对象将在年轻一代中获得另一次回收机会。最后,幸存者空间中正在使用的被认为“足够老”的活着的物体被提升到老一代。

在次要垃圾收集结束时,两个幸存空间交换角色。伊甸园空无一人;只有一个幸存者空间在使用;老一代的入住率略有增长。因为活动对象在其操作过程中被复制,所以这种类型的垃圾收集器被称为复制垃圾收集器。

来源:以上内容摘自“”第83页,作者是查理亨特和比努约翰。

票数 25
EN

Stack Overflow用户

发布于 2014-09-16 22:39:57

年青一代:它是一个短暂居住的地方,分为两个空间:

Eden空间:新对象将在内存池中分配。假设大多数对象在创建后不久就会被解除引用,并且变得不可访问。未被解除引用的对象将被新一代垃圾收集器复制到幸存空间中。在某些特殊情况下,它们可能会被直接复制到老一代池中。

Survivor :这两个小空间保存年轻一代垃圾收集的幸存对象。幸存的对象将从一个存活者复制到另一个存活者的(少量)次数。这允许获取更多解除引用的对象。

老一代:是最大的内存池,应该保存长寿命的对象。一旦对象离开幸存空间,它们就会被复制到这个池中。

永久生成:这个完全未知的池保留了所有类的信息。对于大多数应用程序来说,它不需要任何注意。可能需要对它进行调整,以适应具有多个类的一些应用程序。如果应用程序永久地装入和卸载类,它可能也需要一些注意。

其他优势:

  • Memory fragmentation
  • It提高了

的GC性能

请找到以下链接以获取更多详细信息,以帮助您了解更多信息

http://www.scalingbits.com/javaprimer

http://java.sys-con.com/node/84695

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

https://stackoverflow.com/questions/10695298

复制
相关文章

相似问题

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