【问题标题】:Threshold on old space in ParallelOldGC Garbage CollectorParallelOldGC 垃圾收集器中旧空间的阈值
【发布时间】:2025-11-28 19:40:01
【问题描述】:

我在我的应用程序中使用ParallelOldGC 作为垃圾收集器。最大堆大小设置为 2 GB,并且正在处理 Java 热点 6、27 更新。

由于旧空间已满,我的应用程序创建了如此多的长寿命对象。因此根据并行 GC 算法,当旧空间快满时触发 Full GC。由于堆大小为 2 GB,因此收集器清理旧空间需要 100 多秒,这是不可接受的。

我正在考虑将旧空间的阈值设置为 30,以便当旧空间完成 30% 时,将调用 Full GC,因为此解决方案会增加 FullGC 计数,但会减少应用程序暂停时间。

我观察到 CMS 包含带有 XX:CMSInitiatingOccupancyFraction 的此类功能,但由于 CMS 的某些缺点无法切换到 CMS。所以在 ParallelOldGC 中是否有任何功能可以设置

提前致谢。

【问题讨论】:

    标签: java garbage-collection jvm-hotspot


    【解决方案1】:

    由于堆大小为 2 GB,因此收集器清理旧空间需要 100 多秒,这是不可接受的。

    由于您实际上要解决的是较长的暂停时间,因此您可以通过 -XX:MaxGCPauseMillis= 设置暂停时间目标,收集器将尝试实现这一目标。

    它可能由于各种原因而无法满足它,例如因为不允许在收集时消耗足够的 CPU 时间(通过GCTimeRatio),或者仅仅因为您有太多旧的、活动的对象而无法实现目标(在这些情况下使用 G1 或 CMS)。

    【讨论】: