G1 不再以固定大小以及固定数量的分代区域划分,而是把连续的 Java 堆分成多个大小相等的独立区域(Region),每一个 Region 都可以根据需要被设置为新生代的 Eden 空间、Survivor 空间或者是老年代空间。G1 收集器能够对不同角色的 Region 采用不同的处理策略。
Region 中有一类特殊的 Humongous 区域,专门用来存储大对象的。G1 认为只要大小超过了一个 Region 容量的一般的对象,即可判定为大对象。每个 Region 的大小可以通过参数 -XX:G1HeapRegionSize 设定,取值范围为 1MB~32MB,且应是 2 的 N 次幂。对于那些超过了整个 Region 容量的超级大对象,将会被存放在 N 个连续的 Humongous Region 之中,G1 的大多数行为都会把 Humongous Region 作为老年代的一部分来进行看待。
G1 收集器能建立可预测的停顿时间模型,它将 Region 作为单次回收的最小单元,即每次收集的内存空间都是 Region 大小的整数倍。G1 收集器会跟踪各个 Region 中的垃圾堆积的「价值」大小,价值即回收所获得的空间大小以及回收所需要时间的经验值,然后维护一个优先级列表,每次根据用户设定的收集停顿时间(使用 -XX:MaxGCPauseMillis 指定,默认值是 200ms)优先处理回收价值收益最大的那些 Region,这也就是 Garbage First 名字的由来。
G1 收集器 使用 Region 划分内存空间,以及 具有优先级的区域回收方式,保证 G1 收集器在有限的时间内获得尽可能高的收集效率。