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

由于旧空间已满,我的应用程序创建了许多长寿命的对象。因此,按照并行GC算法,当旧空间几乎满时会触发Full GC。由于堆大小为2 GB,因此清理旧空间会使收集器花费100秒以上的时间,这是不可接受的。

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

我已经观察到CMS包含带有XX:CMSInitiatingOccupancyFraction的功能,但是由于CMS无法切换到CMS的某些缺点,因此ParallelOldGC中是否有任何功能需要设置

提前致谢。

最佳答案

由于堆大小为2 GB,因此清理旧空间会使收集器花费100多秒钟的时间,这是不可接受的。


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

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

10-06 05:54