✔ 应用于新生代和老年代,在JDK9之后默认使用G1
✔ 划分成多个区域,每个区域都可以充当eden、survivor、old、humongous,其中humongous专为大对象准备
✔ 采用复制算法
✔ 响应时间与吞吐量兼顾
✔ 分成三个阶段: 新生代回收、并发标记、混合收集
✔ 如果并发失败(即回收速度赶不上创建新对象速度),会触发Full GC
❒ Young Collection(年轻代垃圾回收)
✔ 初始时,所有区域都处于空闲状态
✔ 创建了一些对象,挑出一些空闲区域作为伊甸园区存储这些对象
✔ 当伊甸园需要垃圾回收时,挑出一个空闲区域作为幸存区,用复制算法复制存活对象,需要暂停用户线程
✔ 随着时间流逝,伊甸园的内存又有不足
✔ 将伊甸园以及之前幸存区中的存活对象,采用复制算法,复制到新的幸存区,其中较老对象晋升至老年代
❒ Young Collection + Concurrent Mark(年轻代垃圾回收 + 并发标记)
✔ 当老年代占用内存超过阈值(默认是45%)后,触发并发标记,这时无需暂停用户线程
✔ 并发标记之后,会有重新标记阶段解决漏标问题,此时需要暂停用户线程。
✔ 这些都完成后就知道了老年代有哪些存活对象,随后进入混合收集阶段。此时不会对所有老年代区域进行回收,而是根据暂停时间目标优先回收价值高(存活对象少)的区域(这也是Gabage First名称的由来)。
❒ Mixed Collection (混合垃圾回收)
✔ 混合收集阶段中,参与复制的有eden、survivor、old