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

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

===============>>#1 票数:4 已采纳

并发马克扫描

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

-XX:CMSInitiatingOccupancyFraction=42

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

请注意,CMSInitiatingOccupancyFraction仅对第一个集合有效。 要启用它“for good”,请添加UseCMSInitiatingOccupancyOnly:

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=42

最大堆自由比率

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

-XX:MaxHeapFreeRatio=42

深究

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

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

因为通常JVM非常善于知道何时收集,并且它只会变得更好。


其他H?tSpot VM选项

  ask by bob dabelina translate from so

未解决问题?本站智能推荐: