在 Java 中,HotSpot 虚拟机默认的垃圾回收器(Garbage Collector, GC)取决于 Java 版本和运行环境。以下是不同 Java 版本中 HotSpot 虚拟机的默认垃圾回收器:
-
Java 8 及更早版本:
- 并行垃圾回收器(Parallel GC):在 Java 8 及更早版本中,HotSpot 虚拟机的默认垃圾回收器是并行垃圾回收器(也称为吞吐量垃圾回收器)。它使用多线程进行年轻代和老年代的垃圾回收,适合多核处理器环境。
- 新生代使用标记复制算法,老年代使用标记整理算法
-
Java 9 到 Java 18:
- G1 垃圾回收器(Garbage-First GC):从 Java 9 开始,HotSpot 虚拟机的默认垃圾回收器变为 G1 垃圾回收器。G1 是一种面向服务端应用的垃圾回收器,旨在提供更可预测的停顿时间(低延迟)和更高的吞吐量。该垃圾收集器把堆划分成多个大小相等的独立区域(Region)来进行垃圾回收,并且可以动态调整区域的大小,空间可以单独进行垃圾回收。
- 初始标记:标记与GC roots直接关联的对象。
- 并发标记:可达性分析。
- 最终标记,对并发标记过程中,用户线程修改的对象再次标记一下。
- 筛选回收:对各个Region的回收价值和成本进行排序,然后根据用户所期望的GC停顿时间制定回收计划并回收。
-
Java 19 及更高版本:
- ZGC(Z Garbage Collector) 或 Shenandoah GC:在某些情况下,Java 19 及更高版本可能会默认使用 ZGC 或 Shenandoah GC,具体取决于运行环境和配置。ZGC 和 Shenandoah 都是低延迟垃圾回收器,旨在将停顿时间控制在毫秒级别,适合对延迟敏感的应用。
如何查看当前使用的垃圾回收器
你可以通过以下命令查看当前 Java 虚拟机使用的垃圾回收器:
java -XX:+PrintCommandLineFlags -version
输出中会显示当前使用的垃圾回收器相关的 JVM 参数。
总结
- Java 8 及更早版本:默认使用 Parallel GC。
- Java 9 到 Java 18:默认使用 G1 GC。
- Java 19 及更高版本:可能默认使用 ZGC 或 Shenandoah GC,具体取决于配置。
如果你有特定的性能需求,可以根据应用场景选择合适的垃圾回收器并进行配置。