头图

什么时候发生GC

 eden区满了之后如果老年代最大可用连续空间大于所有young区对象大小之和,直接进行MinorGC,判断老年代最大可用连续空间是否大于历次MinorGC晋升大小的,如果大于则进行MinorGC。
 MinorGC触发Promotion Failure或者分配大对象导致老年代满了则需要进行FullGC。
另一方面微观的角度讲需要等待所有线程轮询GC标志位然后执行到安全点,或者本身处于安全区域,然后才能从OopMap中枚举GC Roots开始进行GC。

跨代引用问题

在进行MinorGC的过程中,年轻代对象可能被老年代对象引用而导致不应该被回收,所以需要判定哪些年轻代对象被老年代对象所引用。通过一种叫记忆集的数据结构来解决这个问题,记忆集通过卡表或者说是一个字节数组来实现,数组中的每一个数表示这一段地址中的老年代区域是否存在对年轻代对象的引用,如果存在则需要将该区域中的所有对象加入到GC Roots。
对于G1而言,每一个Region都需要维护一个记忆集表示Region中对象是否被其他Region引用。实际上G1的记忆集是一个哈希表,key是Region的起始地址,value是一个集合,集合中是有哪些其他region有引用指向自身。

CMS

CMS是一个主要关注停顿时间的垃圾回收器。
其主要的步骤是初始标记,并发标记,重新标记,并发清除。
初始标记只会标记从GC Roots出发的第一层的关联节点。并发标记和重新标记使用增量更新来修正标记错误。
CMS存在的问题包括cpu吞吐量太低,不能处理GC过程中新出现的浮动垃圾,采用标记清除的算法存在内存碎片等。其主要的意义在于开创了并行GC的先河。

并发标记存在的问题

另外如果一个本来被灰色对象引用的对象的引用被修改成被一个黑色对象的引用时,会导致标记失败。解决的方法包括增量更新和原始快照,增量更新是在黑色对象增加引用时将其标记为脏数据,重新标记阶段重新标记脏数据;原始快照指的是在灰色对象的引用被切断时将灰色对象对白色对象的引用记录下来,在重新标记时从灰色对象出发再次标记。

G1

主要的特点在于可以指定停顿时间,既关注停顿时间也关注cpu的吞吐量。
并发标记阶段通过原始快照来修正标记遗漏。
每个region都需要维护一个记忆集标识哪些其他的region有引用指向当前region。
G1会在每个region中通过TAMS指针来划分一块区域给并发回收过程中产生的新对象分配内存,这些对象被隐式地标记为不可回收。
G1包括两种GC方式分别是YoungGC和MixGC,YoungGC仍会暂停所有用户线程,将存活对象拷贝到survivor或者老年代。MixGC和CMS步骤有些相似,也包括初始标记,并发标记,最终标记和垃圾清除。在进行标记之后会更新统计数据,根据用户指定的停顿时间指定回收计划,回收优先级最高的一部分Region。


cjwdxf
1 声望0 粉丝

下一篇 »
GIT使用指南