本文适用于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
参考资料:
- JDK8文档对java -XX:Use*GC 选项的解释,
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
- JDK11文档对java -XX:Use*GC 选项的解释,
https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE
- 周志明,深入理解Java虚拟机,第3版,3.7.4 垃圾收集器参数总结