老一代必须多大才能触发主要的GC周期?

时间:2014-04-20 00:02:13

标签: java garbage-collection size heap

我正在努力解决生产环境中的高垃圾收集利用率问题,并且想知道设置一个大堆大小是否能保证老一代永远不会被填满会阻止触发主要的GC循环。

为了实现这一点,我认为有一个特定的阈值标记可以触发主要的GC循环。如果这个假设属实,有人可以告诉我这个号码是什么吗?如果没有,我将理解如何实际触发这些主要周期的解释,以及我的大堆策略是否有可能发挥作用。

1 个答案:

答案 0 :(得分:4)

并发标记扫描

假设您使用Concurrent Mark Sweep收集器(例如-XX:+ UseConcMarkSweepGC),默认情况下,当OldGen达到 70%时,它会同时开始收集。但它可以通过CMSInitiatingOccupancyFraction调整,例如:

-XX:CMSInitiatingOccupancyFraction=42

这将以42%开始并发收集,而默认为70%

请注意,CMSInitiatingOccupancyFraction仅对第一个集合有效。为了实现这一目标,我们能够做到这一点。添加UseCMSInitiatingOccupancyOnly:

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=42

最大堆自由率

您还可以查看MaxHeapFreeRatio,它是 GC之后 GC的最大百分比,以避免收缩,默认设置为 70%,但您可以更改那个:

-XX:MaxHeapFreeRatio=42

深究

但在更改任何参数之前,最好了解这个"高垃圾收集利用率的原因":

  • 如果需要经常收集OldGen,为什么要进入OldGen?
  • 您是否正在捕获流媒体数据?
  • 堆大小是否太小而无法解决问题?
  • 将这些特定数据存储在堆中是否有意义?
  • 等..

由于通常JVM非常擅长何时收集,并且它只会变得更好。


其他HоtSpot VM options