G1(Garbage-First)回收器是一种现代的垃圾回收器,引入了一种基于区域的内存管理方式。它是在Java 7中引入的,并在Java 9中成为默认的垃圾回收器。
G1回收器的设计目标是实现低延迟和高吞吐量的垃圾回收。它通过将Java堆划分为多个大小相等的区域(Region),每个区域可以是Eden区、幸存者区或老年代区。G1回收器的工作主要包括以下几个阶段:
-
初始标记(Initial Mark):在这个阶段,G1回收器会暂停应用程序线程,并标记出所有根对象直接引用的存活对象。这个阶段需要较短的暂停时间。
-
并发标记(Concurrent Marking):在这个阶段,应用程序线程和垃圾回收线程并发执行,标记出所有从根对象可达的存活对象。这个阶段可能会伴随着应用程序的执行,对应用程序的暂停时间比较短。
-
最终标记(Final Mark):在这个阶段,G1回收器再次暂停应用程序线程,完成并发标记阶段期间产生的变动,并标记出所有的存活对象。
-
筛选回收(Live Data Counting and Evacuation):在这个阶段,G1回收器会根据区域的存活对象数量来选择哪些区域需要进行回收。然后,它将选定的区域中的存活对象复制到其他空闲的区域,并回收被复制的区域。
G1回收器的一个重要特性是它可以根据用户指定的暂停时间目标(Pause Time Goal)来调整回收的策略。通过调整回收的区域数量和回收的时间片,G1回收器可以尽量保持较低的暂停时间,以满足应用程序的低延迟要求。
总结起来,G1回收器是一种现代的垃圾回收器,通过将Java堆划分为多个区域,并采用并发标记和部分复制的策略,实现了较低的暂停时间和较高的吞吐量。它适用于大内存应用和对延迟敏感的场景。