G1作为JDK9之后的服务端默认收集器,且不再区分年轻代和⽼年代进⾏垃圾回收,他把内存划分为多个Region,每个Region的⼤⼩可以通过-XX:G1HeapRegionSize设置,⼤⼩为1~32M,对于⼤对象的存储则衍⽣出Humongous的概念,超过Region⼤⼩⼀半的对象会被认为是⼤对象,⽽超过整个Region⼤⼩的对象被认为是超级⼤对象,将会被存储在连续的N个Humongous Region中,G1在进⾏回收的时候会在后台维护⼀个优先级列表,每次根据⽤户设定允许的收集停顿时间优先回收收益最⼤的Region。
G1的回收过程分为以下四个步骤:
1. 初始标记:标记GC ROOT能关联到的对象,需要STW
2. 并发标记:从GCRoots的直接关联对象开始遍历整个对象图的过程,扫描完成后还会重新处理并发标记过程中产⽣变动的对象
3. 最终标记:短暂暂停⽤户线程,再处理⼀次,需要STW
4. 筛选回收:更新Region的统计数据,对每个Region的回收价值和成本排序,根据⽤户设置的停顿时间制定回收计划。再把需要回收的Region中存活对象复制到空的Region,同时清理旧的Region。需要STW
总的来说除了并发标记之外,其他⼏个过程也还是需要短暂的STW,G1的⽬标是在停顿和延迟可控的情况下尽可能提⾼吞吐量。
网友评论