Java的GC:为什么是两个幸存者的区域?(Java GC: why two survivor re

2019-06-24 15:28发布

对于Sun / Oracle的JVM,我读过的GC算法中分为新生代成一个伊甸园区和两个幸存者地区。 我想知道的是,为什么是两个幸存者的区域,而不是只有一个? 该算法中可以保持伊甸园,只是一个幸存者区(它目前做了两个幸存者地区之间的路)之间的乒乓效应; 还是有什么缺点,这种方式?

Answer 1:

我相信JRockit虚拟的GC实现更象你建议,只是一个单一的伊甸园和单生存空间,但不可以引用我这句话。

究其原因,热点JVM的两大生存空间是减少需要处理碎片。 新对象在伊甸园的空间分配。 一切都很好。 当那是满的,你需要一个GC,所以杀过时对象和挪活者的生存空间,在那里他们可以被晋升为老一代成熟前一阵子。 不过好为止。 我们跑出去的伊甸园空间下一次,虽然,我们有一个难题。 接下来的GC走来,并清除出伊甸园都和我们的生存空间一定的空间,但空间不是连续的。 因此,它是更好地

  1. 尽量合身幸存者伊甸成是由GC清除了生存空间的孔?
  2. 按住Shift键的所有对象的生存空间下,以消除碎片, 然后将幸存者成吗?
  3. 只是说“拧,我们反正周围的一切活动,”和所有从两个空间幸存者复制到一个完全独立的空间 - 第二生存空间 - 从而让你用干净的伊甸园和幸存者空间,您可以重复上的下一个GC的序列?

Sun的问题的答案是显而易见的。



Answer 2:

两个Survivor空间的作用被小垃圾收集的操作之后逆转

这两个生存空间。 这些认为,幸存下来的至少一种次垃圾回收,但已再有一次机会被晋升为老一代之前不可达的对象。 其中只有一人持有的对象,而另一种是大部分时间闲置。

在一个小垃圾收集的运作,已找到的对象是垃圾将被标记。 在伊甸园存活收集活动对象复制到未使用的生存空间。 在生存空间正在被使用,这将给予另一次机会的年轻一代要回收的活动对象,也被复制到未使用的生存空间。 最后,在生存空间正在使用中,被认为活物“够大”,都提升到了老一代。

在轻微的垃圾收集结束后,两个生存空间互换角色。 伊甸完全是空的; 只有一个幸存者空间正在使用; 和老一代的入住率略有上升。 由于活动对象其操作过程中被复制,这种类型的垃圾收集器的被称为复制垃圾收集器。

来源:以上是从83页的摘录Java性能 ,查理亨特和BINU约翰。



Answer 3:

年轻一代:这是地方住了短暂停留,并且分成两个空间:

伊甸园空间:新对象将在内存池中进行分配。 假设是,大多数对象得到解除引用和他们的创作后,很快成为不可访问。 不被解除引用的对象将被新产生的垃圾收集入生存空间被复制。 他们可能会直接复制ň一些特殊情况下进入老一代池。

生存空间:这两个小空间保持年轻一代的垃圾收集幸存的对象。 幸存的对象将被复制为次的(小)数量从一个幸存者到另一个。 这使我们收获更多的解除引用的对象。

老一代:最大的内存池应保持长期生活的对象。 一旦他们离开了生存空间的对象也越来越被复制到这个池中。

Permament代:这相当未知池保留所有类的信息。 它并不需要对于大多数应用程序的任何关注。 它可能需要适合与许多类一些应用程序。 这可能需要一些attentention以及如果申请永久加载和卸载类。

其他优点:

  • 内存碎片
  • 它改善GC性能

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

http://www.scalingbits.com/javaprimer

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



Answer 4:

目前所有的答案说说内存碎片,这也是另一个原因有几代GC。

运行时记录所有的“老物件”点到“新对象”,这样做是每次“指针”字段更新时间。 然后,当“矿工” GC完成后,只有“新”对象需要进行扫描。

多年来,它已经发现,只是有“新”与“旧”是不够的,这是好事,有一个第三代是“中年”。



Answer 5:

什么是复制的一代的所有实例从一个空间到另一个,与在存储地址的顺序复制他们一代的空间开始的优点和缺点? 为了处理项目很可能需要增加每个项目一个额外的指针,但将消除对“幸存者”空间的一个需要。



Answer 6:

两名幸存者是实现标记和复制算法。 这些在GC用于年轻一代。 作为备选方案3中提到的由Ryan 这里



Answer 7:

在Java中的Java堆存储器对象的区域中创建名为当JVM启动创建堆内存。堆内存,堆内存增加或当一个Java应用程序的运行降低。 当堆存储器变满时,垃圾收集器移除未使用的对象,从而垃圾收集器使得新对象的空间。

堆存储器被划分为称为两个区域(或子孙)

1.young空间。 2.old空间。

1.In年轻的空间,有一个新的对象伊甸园空间,有两个生存空间(来和去),这两个生存空间始终是相同的大小。

2.Survivor空间用于存储生存Objects.When年轻空间已满时,垃圾收集器通过运行一个特殊的年轻的集合,其中已经活得够久的年轻空间中的所有对象都提升(移动)到删除未使用的对象旧空间,从而腾出空间年轻人更多的对象分配。

3.如果伊甸园空间已满,GC将运行,如果任何物体都住在伊甸园的空间,那些被移动到生存空间。

4.In年轻空间,GC正常使用复制算法,这是速度快,每次,存活对象复制到幸存者空间之一。

5.如果幸存者空间已满,活对象其余的都直接复制到老的空间。

6.In旧空间,GC nornally使用马克 - 紧凑型算法,它是缓慢的,但需要较少的内存。

7.当旧的空间已满垃圾被收集在那里,这个过程被称为老collection.In旧空间,万岁时间对象呆在那里。

内存8.Out会发生有旧的或烫发部分做了新的对象,甚至GC没有空间。

9.Object是垃圾收集过程中移动:伊甸 - >幸存者 - >终身(旧空间)



文章来源: Java GC: why two survivor regions?