衡量垃圾收集器的三项最重要的指标是:
随着硬件技术的提高,对于内存占用要求变得不是太高了,更关注延迟。
G1会随着堆变大,停顿的时间变长,原因也很容易理解,需要标记的对象越来越多了。但是新的ZGC、shenandoah不会,他们是与内存大小无关的。
以下两种都是基于标记-整理算法
由RedHat公司开发
1.三个与G1相比不同之处
2.九个阶段
初始标记
并发标记
最终标记
并发清理
并发回收
与其他收集器的核心差异,使用了读屏障(Brooks Pointers)来实现了并发的回收,而不需要停顿。
初始引用更新
并发引用更新
最终引用更新
并发清理
主要抓住三个重要的阶段:并发标记、并发回收、并发引用更新
3.读屏障-- Brooks Pointer
注意这个是放在**对象**上面的。
每次对象访问会带来一次额外的转向开销,尽管这个开销已经被优化到只有一行指令的程度。
问题:修改的时候如何保证正确性?
必须对转发指针的访问操作采取同步措施,这里使用的是比较并交换。
由Oracle开发。
1.主要特征
ZGC 收集器是一款基于Region 内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。
2.内存布局
Region具有动态性–动态创建和销毁
3.标志性设计
染色指针技术
对对象的种种标记不再是放在对象的本身属性上,而是放在了指向对象的引用身上。(也就是说这里不需要在用读屏障了)
— 某个对象只有它的引用关系能决定它存活与否,对象上其他所有的属性都不能够影响它的存活判定结果。
ZGC 的染色指针是最直接的、最纯粹的,它直接把标记信息记在引用对象的指针上,这时,与其说可达性分析是遍历对象图来标记对象,还不如说是遍历“引用图”来标记“引用”了。
三大优势:
把染色指针中的标志位看作是地址的分段符,那只要将这些不同的地址段都映射到同一个物理内存空间,经过多重映射转换后,就可以使用染色指针正常进行寻址了,效果如图 :
4.主要流程
并发标记
并发预备重分配
并发重分配
重分配是ZGC执行过程中的核心阶段。这个过程要把重分配集中的存活对象复制到新Region 上,并为重分配集中的每个 Region维护一个转发表(Forward Table),记录从旧对象到新对象的转向关系。
并发重映射