我在应用程序中使用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)。