G1 (Garbage-First) 垃圾收集器是Java虚拟机(JVM)中的一个现代化的垃圾回收器,它首次出现在JDK 7 Update 4,并在JDK 9中成为默认的垃圾收集器。G1的主要设计目标是在提供可预测的停顿时间的同时达到高吞吐量,这对于响应时间和延迟敏感的应用程序非常有用。
下面是G1垃圾收集器的一些主要特性和工作原理:
区域化内存布局
- 堆分区:G1将整个堆划分为多个大小相同的区域(Region),每个区域都可以独立地充当Eden空间、Survivor空间或老年代的一部分。
- 混合使用:这种灵活性使得G1可以在不同阶段将不同的区域用作不同的目的,例如,年轻代和老年代可以共享一些区域。
并发标记过程
- 并发标记:G1使用并发标记算法来减少应用程序暂停的时间。这个过程可以在应用程序运行的同时进行,以确定哪些对象是存活的,哪些对象是垃圾。
- 增量更新:G1使用增量更新的方式,在标记过程中不断更新已知的引用信息,以避免全堆扫描。
并行与并发型
- 并行处理:G1利用多核处理器的优势,可以在多个CPU核心上同时执行垃圾回收任务。
- 并发型:除了并行处理之外,G1还支持并发执行,这意味着某些GC操作可以在应用程序线程执行的同时进行。
拷贝与压缩
- 年轻代回收:对于年轻代的回收,G1采用类似复制算法的策略,但是只复制活对象到另一个空闲区域。
- 老年代压缩:对于老年代,G1使用标记-压缩算法,将存活的对象移动到堆的一端,从而释放出连续的空间。
停顿时间预测
- 预测性控制:G1通过预测下一次垃圾回收需要的停顿时间,并基于这个预测来决定哪些区域应该被回收,以尽量保持停顿时间在预定的目标范围内。
自适应性
- 动态调整:G1能够根据系统负载和垃圾收集的历史数据动态调整其参数和策略,以优化性能。
配置选项
- 启动参数:可以通过设置JVM参数来启用G1垃圾收集器,例如
-XX:+UseG1GC
,还可以设定期望的最大停顿时间,如-XX:MaxGCPauseMillis=<milliseconds>
。
这些特性共同作用,使G1成为一个高效且适用于现代多核硬件环境的垃圾收集器。