-XX:+UseG1GC 是 -Xincgc 的正确替代品吗?

2022-09-04 20:22:13

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

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

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


答案 1

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

Xincgc 是处于增量模式的 CMS。您看到的主要好处可能是由于从吞吐量收集器切换到 CMS,而不是从增量模式(专为单核 CPU 设计的)引起的。

增量模式也被弃用,因此只需通过启用CMS,看看它是否适合您。更新:CMS也被弃用,然后在以后的OpenJDK版本中被删除-XX:+UseConcMarkSweepGC

当然,您也可以尝试G1GC,它也旨在达到低暂停时间目标,并且具有它不会像CMS那样遭受碎片的影响,因此不太可能遇到并发模式故障,从而导致单线程停止世界收集。更新:较新的OpenJDK版本除了G1GC之外还提供了额外的低暂停时间收集器)因此,请尝试两者并测量。

另请参阅:Oracle 的 Java 8 GC Tuning Guides


答案 2

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

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

后面的 2 个参数用于记录 GC 活动。