G1分区算法的堆结构 #
我们来了解一下分区回收算法的堆空间是如何划分的。下图是 G1 GC 的堆结构:
G1 也是一个分代的垃圾回收算法,不过,和之前介绍的 CMS、Scavenge 算法不同的是:G1 的老年代和年轻代不再是一块连续的空间,整个堆被划分成若干个大小相同的 Region,也就是区。Region 的类型有 Eden、Survivor、Old、
Humongous 四种,而且每个 Region 都可以单独进行管理。
Humongous 是用来存放大对象的,如果一个对象的大小大于一个 Region 的 50% (默认值),那么我们就认为这个对象是一个大对象。为了防止大对象的频繁拷贝,我们可以将大对象直接放到 Humongous 中。
而 Eden、Survivor、Old 三种区域和我们前面课程中介绍的 Eden 分区、 Survivor 分区以及老年代的作用是类似的。也就是说,对象会在 Eden Regions 中分配,当进行年轻代 GC 时,会将活跃对象拷贝到 Survivor Regions;当对象年龄超过晋升阈值时,就把活跃对象复制进 Old Regions。