GC算法之G1-PART I
由于G1回收器的细节过于复杂,本节只做一个基本介绍。
G1 将堆划分为一组大小相同的堆区域(region),每个区域都是连续的虚拟内存范围。每个区域都可能是 Eden 区域、Survivor 区域或, Old 区域, humongous区域或是空白区域(empty)。
- empty
- eden
- survivor
- old
- humongous
应用程序大部分情况分配在eden区,只有巨大对象除外(humongous object,size>region size/2),它被直接分配到humongous区,而h区被划分到老年代。
Garbage Collection Cycle
G1在上图中的三种状态中切换:
- young
- young + concurrent mark
- mixed
当年老代占用率达到某个阈值时,即Initiating Heap Occupancy threshold,即启动仅年轻阶段和young+concurrent mark阶段之间的过渡。默认情况下,它是 45%,但这可以通过 InitiatingHeapOccupancyPercent JVM 选项更改。
young
young的回收算法跟之前的STW(stop the world)的mark copy类似。
young concurrent mark
Concurrent Start
并发标记确定老年代区域中所有当前可访问的(活动的)对象.
Remark
此暂停完成标记本身,执行全局引用处理和类卸载,回收完全空的区域并清理内部数据结构。在 Remark 和 Cleanup 之间 G1 计算信息以便稍后能够同时回收选定老年代区域中的可用空间,这将在 Cleanup 暂停中完成。
Cleanup
回收空白区域,并确定mixed收集是否会在接下来发生。
mixed
此阶段由多个混合集合组成,除了新生代区域外,还疏散了老年代区域集的活动对象。当 G1 确定疏散更多老年代区域不会产生足够的可用空间时,该阶段结束。