年轻一代的JVM垃圾收集

Lin*_* Ma 12 garbage-collection jvm

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

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

Tom*_*icz 30

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

Java内存布局http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/190244.gif

它来自Java SE 6 HotSpot [tm]虚拟机垃圾收集调整,一站式学习GC内部的一切.但要解决您的直接问题:

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

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

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

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

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

在随后的次要集合中,还有其他步骤:

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

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

当终身空间已满时,主要GC运行.