对象分配失败,就会进入到Evac失败过程,在GC日志详情中会打印相关信息
1.处理失败
2.再次尝试分配,仍然不成功,进行Full GC
7.1 Evac失败
把对象放入到Evac失败栈;直接更新对象的RSet,不需要对已复制的对象做额外回收之类的处理
检查是否有指向自己的指针,如果有,就代表发生了复制失败。需要删除指针,恢复对象头
1. 把这个分配失败的对象,放入到特殊的dirty card队列中
2.执行Redirty重构整个RSet,确保引用的正确性
7.2 FGC
JDK10之前,FGC都是串行回收;需要停止并发标记,停止增量回收
串行回收采用标记清除算法
7.2.2 计算对象的新地址