将一个年轻物体放置在旧区域,使其成为旧物体或将其保存在幸存者区域的标准是什么?
official tutorial州的Young GC第4点:
“将活动对象撤离(即,复制或移动)到一个或多个 幸存者地区。如果满足老化阈值,则为某些对象 被提升到老一代地区。“
但我找不到那个标准。
修改
Amit Bhati向我指出了MaxTenuringThreshold参数。我从官方文件中了解不多,但我想我开始明白它是如何运作的。
答案 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
答案 2 :(得分:0)
来自Javadocs:
堆空间分为旧一代和新一代。新的 生成包括新的对象空间(eden)和两个幸存者 空间。 JVM在eden空间中分配新对象并移动 从新一代到老一代的长寿命物品。
年轻一代使用快速复制垃圾收集器 在伊甸园中使用两个半空间(幸存者空间),复制 幸存的物体从一个幸存者空间到第二个。对象那个 幸存下来的多个年轻的太空集合都是终身的,这意味着它 复制到终身代。终身代更大 填写速度不那么快。因此,垃圾收集频率较低; 每个系列只需要一个年轻的空间系列。 收集终身空间也被称为完整 世代收藏。
频繁的年轻空间收藏很快(几毫秒), 而整整一代的收藏需要更长的时间(数十年 毫秒到几秒,具体取决于堆大小。)
其他GC算法,例如并发标记扫描(CMS) 算法,是增量的。他们将完整的GC分成几个 增量件。这提供了小暂停的高概率。 此过程带来了开销,对于企业来说不是必需的 网络应用程序。
另请查看此文章:Java Garbage Collectors – Moving to Java7 Garbage-First (G1) Collector
年轻一代由一个伊甸园和两个幸存者空间组成。 伊甸园中的活物体被复制到最初空的幸存者身上 空间,在图中标记为S1,除了太大的空间 舒适地适应S1空间。这些对象直接复制到 老一辈。被占领的幸存者空间中的活物 (标记为S0)仍然相对年轻也被复制到 其他幸存者空间,而相对较旧的对象被复制 对老一辈。如果S1空间变满,则为活动对象 来自伊甸园或S0的未被复制的终身职位, 不管他们的年龄。保留在Eden或S0空间中的任何对象 复制了活动对象后,不是活动的,也不是必须的 检查。下图说明了年轻一代之后的堆 系列:
年轻一代的收藏导致世界暂停。后 收集,伊甸园和一个幸存者空间是空的。现在让我们看看如何 CMS处理旧一代集合。它基本上由两部分组成 主要步骤 - 标记所有活动物体并清扫它们。