1.2.6 Shenandoah
Shenandoah是另一款实验性质的垃圾回收器,在JDK 12中将正式合入OpenJDK的官方项目。Shenandoah的起源要追溯到2014年之前,最早由Red Hat公司发起,目标是利用现代多核CPU的优势,减少大堆内存在垃圾回收发生时的停顿时间。Shenandoah后来被贡献给了OpenJDK,正式成为OpenJDK的开源项目,也就是JEP 189。
Shenandoah最初的目标是把垃圾回收停顿时间降到毫秒级别,并且对内存的支持扩展到太字节(TB)级别。为了降低停顿时间,回收器需要使用更多的线程来并行处理回收任务。如果要在降低停顿时间的同时支持更大的堆空间,那么CPU需要具备更好的多核处理能力。相比于CMS和G1, Shenandoah不仅进行并行的垃圾标记,在压缩堆空间时也是并发进行的。从这一点上看,Shenandoah和ZGC是非常类似的,都是解决了并发转移的问题,不过它们两者在实现上采用不同的方法。目前从效果来看,Shenandoah和ZGC存在竞争关系,当然竞争不是坏事,一方面可以促进社区的蓬勃发展,另外一方面这两个项目可以相互借鉴,这也是为什么在ZGC加入OpenJDK之后,Shenandoah也被整合到OpenJDK。
Shenandoah不像ZGC仅支持Linux 64位系统,它是在原来的对象头上增加一个额外的指针,通过这个指针可以实现读屏障、写屏障和比较屏障,从而实现并发标记和并发转移时的并发处理。因为Shenandoah立项比较早,所以实现的功能也更多、更全。到目前为止,Shenandoah已经实现了很多特性,包括解释器、C1屏障、C2屏障、对引用的支持、对JNI临界区域的支持、对System.gc()的支持等。Shenandoah目前还算稳定,它的平均性能能够达到G1的90%,有时会差一些,比如只有G1的70%,不过有时候会超过G1的性能,比如达到G1的150%。
虽然Shenandoah和ZGC都加入OpenJDK中,就目前的结果来说,Shenandoah功能实现得更为齐全,但Shenandoah在进行并发处理时需要3种屏障,而ZGC在进行并发处理时仅需要读屏障,且不需要访问内存对象,所以效率更高。但两者的路都还很长,最后的结果如何目前还未可知。关于Shenandoah更多的内容可以参考官方网站。