G1垃圾回收器从根集合(线程栈等)开始出发寻找垃圾
选择CSet
CSet即是 Collection set,即需要被回收的集合,一般来说是所有的新生代分区均会被加入到CSet中
根处理
从根(线程栈等)出发, 把存活对象复制到新的分区,同时把对象的每一个field都加入到待处理栈,把旧对象的对象头更新为指向[新复制的对象]且对象头的最后两位设置为11表示已经被标记(64位机中指针48位可用).
处理RSet
因为新生代的对象发生复制移动,RSet中所表示的对象的字段需要更新至新对象的地址.
新一轮复制
可能根集合中并没有新生代全部的对象,部分可能有新生代对象所new出来,所以从刚才根处理时所构建的field栈中处理位于新生代的对象,更新RSet
继续更新RSet
释放空间
清理旧的新生代分区.
主体差不多就这样,关键是各种数据结构的维护,内存的分配呢