对象如何在G1(垃圾优先)垃圾收集器上老化?

时间:2016-01-28 09:08:19

标签: java garbage-collection

将一个年轻物体放置在旧区域,使其成为旧物体或将其保存在幸存者区域的标准是什么?

official tutorial州的Young GC第4点:

  

“将活动对象撤离(即,复制或移动)到一个或多个   幸存者地区。如果满足老化阈值,则为某些对象   被提升到老一代地区。“

但我找不到那个标准。

修改

Amit Bhati向我指出了MaxTenuringThreshold参数。我从官方文件中了解不多,但我想我开始明白它是如何运作的。

3 个答案:

答案 0 :(得分:2)

在你的帮助下,我想我找到了答案here

  

-XX:InitialTenuringThreshold = 7 设置在并行年轻收集器中用于自适应GC大小调整的初始时效阈值。该   终身门槛是一个物体在年轻人中存活的次数   在被提升为旧的或终身的一代之前的收集。    -XX:MaxTenuringThreshold = n 设置自适应GC大小调整中使用的最大暂定阈值。当前最大值为15.默认值   并行收集器的值为15,CMS为4。

位于调试选项标题下:)

垃圾优先(G1)垃圾收集选项下,您可以找到:

  

-XX:MaxTenuringThreshold = n 终身临界值的最大值。默认值为15.

如果您没有在其他部分读取InitialTenuringThreshold描述,则说明不太清楚。似乎InitialTenuringThreshold不是有效的G1选项,但我认为算法就是那里描述的。

答案 1 :(得分:1)

以下文档擅长解释如何更改(减少)G1收集器中从幸存者空间升级到旧Gen的速率。

http://java-is-the-new-c.blogspot.co.uk/2013/07/tuning-and-benchmarking-java-7s-garbage.html(标题为调整年轻一代的部分)

正如上面的答案所说,MaxTenuringThreshold是关键设置,但这只是一个上限,如果你的YoungGen不够大,不会让它被尊重,那么它将被忽略。在这种情况下,您需要通过NewRatio增加整体YoungGen,或者通过SurvivorRatio

增加SurvivorSpace

答案 2 :(得分:0)

来自Javadocs

  

堆空间分为旧一代和新一代。新的   生成包括新的对象空间(eden)和两个幸存者   空间。 JVM在eden空间中分配新对象并移动   从新一代到老一代的长寿命物品。

     

年轻一代使用快速复制垃圾收集器   在伊甸园中使用两个半空间(幸存者空间),复制   幸存的物体从一个幸存者空间到第二个。对象那个   幸存下来的多个年轻的太空集合都是终身的,这意味着它   复制到终身代。终身代更大   填写速度不那么快。因此,垃圾收集频率较低;   每个系列只需要一个年轻的空间系列。   收集终身空间也被称为完整   世代收藏。

     

频繁的年轻空间收藏很快(几毫秒),   而整整一代的收藏需要更长的时间(数十年   毫秒到几秒,具体取决于堆大小。)

     

其他GC算法,例如并发标记扫描(CMS)   算法,是增量的。他们将完整的GC分成几个   增量件。这提供了小暂停的高概率。   此过程带来了开销,对于企业来说不是必需的   网络应用程序。

另请查看此文章:Java Garbage Collectors – Moving to Java7 Garbage-First (G1) Collector

enter image description here

  

年轻一代由一个伊甸园和两个幸存者空间组成。   伊甸园中的活物体被复制到最初空的幸存者身上   空间,在图中标记为S1,除了太大的空间   舒适地适应S1空间。这些对象直接复制到   老一辈。被占领的幸存者空间中的活物   (标记为S0)仍然相对年轻也被复制到   其他幸存者空间,而相对较旧的对象被复制   对老一辈。如果S1空间变满,则为活动对象   来自伊甸园或S0的未被复制的终身职位,   不管他们的年龄。保留在Eden或S0空间中的任何对象   复制了活动对象后,不是活动的,也不是必须的   检查。下图说明了年轻一代之后的堆   系列:

enter image description here

  

年轻一代的收藏导致世界暂停。后   收集,伊甸园和一个幸存者空间是空的。现在让我们看看如何   CMS处理旧一代集合。它基本上由两部分组成   主要步骤 - 标记所有活动物体并清扫它们。