年轻一代的JVM垃圾收集

时间:2012-12-01 15:30:45

标签: garbage-collection jvm

如果我错了,请随时纠正我。在JVM堆中,有两代,旧的和年轻的。在进行完整的GC时,在老一代中,存在诸如紧凑空间和修复孔之类的繁重操作,这将使JVM挂起。我发现在年轻一代,应用了轻量级GC,我的搜索结果中还有另一个名为Eden的区域涉及年轻一代。然而,在搜索了很多文档后,我仍然对年轻一代的GC有两个混淆,

  1. 在年轻一代中,似乎GC不能像老一代GC那样工作(即老一代GC紧凑并固定孔)?如果是这样,年轻一代的GC是如何运作的?
  2. 什么是伊甸园空间以及这个空间如何在年轻一代中使用?感谢是否可以推荐任何新手的文件。

1 个答案:

答案 0 :(得分:28)

这是你必须记住和理解的单一,最重要的图表:

Java memory layout http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/190244.gif

它来自Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning,一站式学习GC内部的一切。但要解决您的直接问题:

使用new运算符(almost)分配新对象总是发生在Eden空间中。但伊甸园实际上是一堆。当您创建需要N个字节的新对象时,单个指针在该堆栈上前进N个字节,就是这样。分配是快速的,没有搜索自由点,压缩,等等。

当然这个堆栈并不是无限的,在某些时候我们会达到它的目的,触发次要的GC。也很可能多个对象已经是垃圾。那么JVM在次要GC中的作用如下:

  • GC根开始的对象的遍历图

  • 将从GC根到达的所有对象复制到幸存者空间之一(没有间隙,我们知道所有这些,这是一个过程)

  • 消灭伊甸园空间(基本上只是将此堆栈指针移回0

在随后的次要收藏中还有其他步骤:

  • 还检查了一个幸存者空间。来自伊甸园和幸存者空间之一的活物体被复制到第二个幸存者空间。这意味着总有一个免费的幸存者空间。

那么对象如何以终身为代?第一个年轻物体被复制到幸存者空间之一。然后将它们一次又一次地复制到另一个。一旦给定对象来回跳转太多次(可配置,默认为8),它将被提升为终身空间。

主要GC在终身空间已满时运行。