【问题标题】:How full does the old generation have to be to trigger a major GC cycle?老年代必须有多满才能触发一个主要的 GC 周期?
【发布时间】:2014-06-04 07:29:35
【问题描述】:

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

为了做到这一点,我想有一个特定的阈值标记会触发一个主要的 GC 周期。如果这个假设是真的,有人可以告诉我这个数字是多少吗?如果没有,我希望能解释一下这些主要周期是如何实际触发的,以及我的大堆策略是否有可能发挥作用。

【问题讨论】:

  • 具体是哪个 Java 版本?
  • @bobdabelina 你真的应该接受这个答案。如果你使用 CMS

标签: java garbage-collection size heap-memory


【解决方案1】:

并发标记扫描

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

-XX:CMSInitiatingOccupancyFraction=42

这将以 42% 而不是默认的 70% 开始并发收集

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

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=42

最大堆空闲率

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

-XX:MaxHeapFreeRatio=42

深究

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

  • 如果需要如此频繁地收集它,为什么要送到 OldGen?
  • 您是否在捕获流数据?
  • 堆大小是否太小而无法解决问题?
  • 将这些特定数据存储在堆外有意义吗?
  • 等等..

因为通常 JVM 非常擅长知道何时收集,而且它只会越来越好。


其他HоtSpot VM options

【讨论】:

  • 感谢托里修斯。我们确实在使用 CMS,答案很有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-09-09
  • 2021-07-01
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多