读书笔记--老年代收集器

老年代收集器

Serial Old收集器

Serial Old 收集器是在老年代上实现垃圾收集的,是一个单线程收集器,Serial Old 收集器所使用的垃圾回收算法是标记-整理算法。在回收阶段,将标记对象越过堆的空闲区移动到堆的另一端,所有被移动的对象的引用也会被更新指向新的位置。

过程:
  1. 递归标记所有存活对象

    • 老年代中所有根对象
    • 当前代中,被新生代对象所引用的老年代对象
    • 采用广度优先算法查找当前代中的存活对象
  2. 计算所有活跃对象在压缩后的偏移地址

    遍历所有的对象,为存活对象重新计算新对象的地址,并将新地址设置为存活对象的转发指针

  3. 更新对象的引用地址

    遍历各内存代对象/引用,若对象所引用的对象已经被标记,则更新其引用地址为转发指针所转向的新地址

  4. 移动所有活跃/存活对象到新的位置

    遍历老年代对象,对于存活对象,复制原对象的数据内容到压缩后的地址(即转发指针的地址),并初始化新的位置的对象的MarkWord

小结:
  • 用广度优先方法作可达性时,新生代是用to区来保存结果,而老年代是用一个临时stack来保存结果
  • 标记对象:设置对象的对象头为被标记状态,有些对象的对象头可能包含一些信息,需要在GC结束之后进行恢复,所以标记前需保存对象和对应的对象头
使用用途
  • 给Client模式下的虚拟机使用
  • 在Server模式下
    • 在JDK 1.5及之前的版本中与Parallel Scavenge收集器搭配使用
    • 作为CMS收集器的备用方案,在并发收集发生Concurrent Mode Failure时使用
Parallel Old 收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器。

Parallel Old收集器和serial Old收集器的差异
Serial Old收集器是串行的进行垃圾回收,而Parallel old收集器是并行的进行垃圾回收。

CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。从Mark-Sweep上可以看出,CMS收集器(以下简称CMS)是基于“标记-清除”算法实现的。主要应用于B/S模式的服务端(希望系统停顿时间尽可能短,尤其重视响应时间)。

一般情况下会有ParNew来配合执行(默认情况下也是ParNew),ParNew也是使用并行的算法来执行年轻代的回收。除此之外,还可以选择使用Serial收集器来收集年轻代,不过一般很少这样使用。

整个过程分为4步:

  1. 初始标记(会导致第一次Stop The World)

    • 标记老年代中所有的GC Roots能够直接关联的对象,速度很快
    • 标记年轻代中活着的对象引用到的老年代的对象
  2. 并发标记

    • 从初始标记的对象开始找出所有存活对象
    • 因为是标记是并发运行的,在运行期间会发生新生代的对象晋升到老年代、或者是直接在老年代分配对象、或者更新老年代对象的引用关系等等,对于这些对象,都是需要进行重新标记的,否则有些对象就会被遗漏,发生漏标的情况。为了提高重新标记的效率,该阶段会把上述对象所在的Card标识为Dirty,后续只需扫描这些Dirty Card的对象。
    • 此阶段容易导致Concurrent Mode Failure。
  3. 重新标记(会导致第二次Stop The World)

    为了修正并发标记期间应用程序继续运行而导致标记产生变动的部分对象的标记记录。此时的停顿时间比初始标记时稍长,但远比并发标记时短。

  4. 并发清除

    清除那些没有标记的对象并且回收空间。

    **浮动垃圾:**由于CMS并发清理阶段用户线程还在运行着,程序运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在当次收集中处理掉它们,只好留待下一次GC时再清理掉,这一部分垃圾就称为“浮动垃圾”。

缺点:

  1. CMS收集器对资源敏感

    CMS默认启动的回收线程数量是(CPU的个数+3)/4,如果CPU的个数在4个以上,收集器会占用不少于25%的CPU资源,并随着CPU的数量增加而下降。但是当CPU不足4(例如2个)的时候,CMS收集器占用一半的运算能力去执行收集器线程。本来CPU负载就比较大,就会导致用户程序的执行效率下降的很明显。

  2. CMS收集器无法处理浮动垃圾

    CMS收集器无法处理“浮动垃圾”,可能出现“Concurrent Mode Failure”失败而导致另外一次Full GC。因为需预留足够的内存给用户线程使用,所以CMS收集器不像其他收集器一样需要等到老年代快被填满后再进行收集,需要预留部分空间给并发收集时的程序运行使用。若是预留空间不能够满足程序需要,则出现Concurrent Mode Failure失败,并启动Serial Old收集器重新对老年代进行收集。

  3. CMS收集器由于是“标记-清除”算法,所以会产生大量的空间碎片。常常因为无法找到足够大的连续空间来分配当前对象导致不得不提前触发一次Full GC。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值