本文适用于Java HotSpot VM。

    若不指定垃圾收集器,jvm会根据系统配置(操作系统、CPU核数、内存、jvm运行模式等)自动选择垃圾收集器。一般情况下,默认垃圾收集器在JDK 6-8 中是 Parallel Scavenge + Parallel Old,在JDK 9-17 中是 G1。

    表1 java垃圾收集器选项设置的效果(适用于JDK8-11)

    java选项设置 jvm使用的垃圾收集器
    -XX:+UseSerialGC Serial(年轻代), Serial Old(老年代)
    -XX:+UseParallelGC Parallel Scavenge(年轻代), Parallel Old(老年代)
    -XX:+UseParallelOldGC Parallel Scavenge(年轻代), Parallel Old(老年代)
    -XX:+UseParallelGC -XX:+UseParallelOldGC Parallel Scavenge(年轻代), Parallel Old(老年代)
    -XX:+UseConcMarkSweepGC ParNew(年轻代), CMS(老年代), Serial Old(老年代,作为 CMS收集器 concurrent mode failure 时的后备收集器)
    -XX:+UseConcMarkSweepGC -XX:+UseParNewGC ParNew(年轻代), CMS(老年代), Serial Old(老年代,作为 CMS收集器 concurrent mode failure 时的后备收集器)
    -XX:+UseG1GC G1

    要指定垃圾收集器,一般使用以下设置即可:

    • -XX:+UseSerialGC
    • -XX:+UseParallelGC
    • -XX:+UseConcMarkSweepGC (在JDK9中,CMS垃圾收集器被废弃,所以自JDK9起,不需要使用这个设置了)
    • -XX:+UseG1GC

    参考资料:

    1. JDK8文档对java -XX:Use*GC 选项的解释,

    https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

    1. JDK11文档对java -XX:Use*GC 选项的解释,

    https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE

    1. 周志明,深入理解Java虚拟机,第3版,3.7.4 垃圾收集器参数总结