首页  

Shenandoah垃圾收集器     所属分类 jvm 浏览量 1472
http://openjdk.java.net/projects/shenandoah/

Shenandoah is an ultra-low pause time garbage collector that reduces GC pause times 
by performing more garbage collection work concurrently with the running Java program. 
CMS and G1 both perform concurrent marking of live objects. 
Shenandoah adds concurrent compaction.

最开始由RedHat公司独立发展后来贡献给了OpenJDK,相比G1主要改进点在于

支持并发的整理算法,回收阶段可以和用户线程并发执行

Shenandoah 目前不使用分代收集,没有区分 年轻代 和 老年代 

Shenandoah 摒弃了在G1中耗费大量内存和计算资源去维护的记忆集,
改用 连接矩阵(Connection Matrix)的全局数据结构来记录跨Region的引用关系,
降低了处理跨代指针时的记忆集维护消耗,也降低了伪共享问题的发生概率。



初始标记(Initial Marking)
与G1一样,只标记与GC Roots直接关联的对象, 停顿时间与堆大小无关,只与GC Roots的数量相关。

并发标记(Concurrent Marking) 
与G1一样,从GC Root开始对堆中对象进行可达性分析,找出存活的对象,可与用户线程并发执行,耗时取决于堆中存活对象的数量和对象图的结构复杂度

最终标记(Final Marking)
与G1一样,处理剩余的SATB扫描,并在这个阶段统计出回收价值最高的Region,将这些Region构成一组回收集(Collection Set) 


并发清理(Concurrent Cleanup)
用于清理 整个区域内连一个存活对象都没有找到的Region(Immediate Garbage Region)


并发回收(Concurrent Evacuation)
首先把回收集里面的存活对象先复制一份到其他未被使用的Region之中,
然后通过 读屏障 和 Brooks Pointers转发指针技术 来解决在垃圾回收期间用户线程继续读写被移动对象的问题,
耗时取决于回收集的大小


初始引用更新(Initial Update Reference)
并发回收阶段复制对象结束后,需要把堆中所有指向旧对象的引用修正到复制后的新地址。
引用更新的初始化阶段实际上并未做什么具体的处理,设立这个阶段只是为了建立一个线程集合点,确保所有并发回收阶段中进行的收集器线程都已完成分配给它们的对象移动任务而已。
初始引用更新时间很短,会产生一个非常短暂的停顿。

并发引用更新(Concurrent Update Reference) 
真正开始进行引用更新操作,这个阶段是与用户线程一起并发的,时间长短取决于内存中涉及的引用数量的多少。
并发引用更新与并发标记不同,它不再需要沿着对象图来搜索,只需要按照内存物理地址的顺序,线性地搜索出引用类型,把旧值改为新值即可。

最终引用更新(Final Update Reference)
解决了堆中的引用更新后,还要修正存在于GCRoots中的引用。会产生一个非常短暂的停顿,停顿时间只与GC Roots的数量相关。

并发清理(Concurrent Cleanup)
经过并发回收和引用更新之后,整个回收集中所有的Region已无存活对象,最后再调用一次并发清理过程来回收这些Region的内存空间 



连接矩阵
连接矩阵可以简单理解为一张二维表格,如果Region N有对象指向RegionM,就在表格的N行M列中打上一个标记,
如果Region 5中的对象Baz引用了Region 3的Foo,Foo又引用了Region 1的Bar,那连接矩阵中的5行3列、3行1列会被打上标记。
在回收时通过这张表格就可以得出哪些Region之间产生了跨代引用。


Brooks Pointer 转发指针技术
复制对象这件事情如果将用户线程冻结起来再做那是相当简单的,但如果两者必须要同时并发进行的话,就变得复杂。
其困难点是在移动对象的同时,用户线程仍然可能不停对被移动的对象进行读写访问,移动对象是一次性的行为,
但移动之后整个内存中所有指向该对象的引用都还是旧对象的地址,很难一瞬间全部改过来。

Brooks Pointer 转发指针技术  对象移动与用户程序并发读写对象

Brooks 在原有对象布局结构的最前面统一增加一个新的引用字段,在正常不处于并发移动的情况下,该引用指向对象自己
在对象移动的时候我们只需要将Brooks Pointer 指向新对象,在对象访问过程中,只通一条mov指令就可以完成对新对象的访问

写操作  CAS(Compare And Swap)  GC线程 和 用户线程  

优点 延迟低

缺点
高运行负担使得吞吐量下降;使用大量的读写屏障,尤其是读屏障,增大系统的性能开销;

上一篇     下一篇
gc日志相关参数

MySQL事务机制

秒杀系统设计思路

httpclient post json数据

jmx信息获取

JMX之Jolokia使用