是-XX:+ UseG1GC正确替换-Xincgc?

目前,我们通过在java命令中添加-Xincgc来使用增量垃圾收集器。 在JDK 8中,不推荐使用此开关。 那么什么是它的等效替代品呢? -XX:+UseG1GC

背景:应用程序有一个8GB的堆,并创建了许多短生命对象。 我注意到它经常暂停几秒钟来进行垃圾收集。 出于好奇,我添加了-Xincgc并发现停顿消失了,整体性能提高了~4倍。

不幸的是,我没有找到任何关于-Xincgc触发什么类型的垃圾收集器的-Xincgc 。 有CMS(并发标记和扫描)和新G1(垃圾优先)。 但是我用-Xincgc得到了-Xincgc

对于Oracle / OpenJDK 8,大多数机器上的默认收集器是并行吞吐量收集器,但某些32位Windows机器除外,它可以是串行GC。

Xincgc是增量模式的CMS。 您可能看到的主要好处可能是从吞吐量收集器切换到CMS,而不是从专用于单核CPU的增量模式。

增量模式也已弃用 ,因此只需通过-XX:+UseConcMarkSweepGC启用CMS -XX:+UseConcMarkSweepGC ,看看它是否适合您。

当然,您也可以尝试G1GC,它也可以达到低暂停时间目标,并且具有不像CMS那样受到碎片影响的优势,因此不太可能遇到导致单线程停止的并发模式故障世界collections。

所以,尝试两者并衡量。

另请参见: Oracle的Java 8 GC调优指南

直到此选项在较新版本中被Oracle完全弃用。 我们仍然可以通过应用以下jvm参数来使用它:

 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

后两个参数用于登录GC活动。