JVM学习笔记16

63 阅读1分钟

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 确定疏散更多老年代区域不会产生足够的可用空间时,该阶段结束。