java VM(3)之垃圾收集器

​HotSpot 虚拟机包含的垃圾收集器如下图(来源 深入理解Java虚拟机):

图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。

 

Serial 收集器

    Serial 收集器是最基本,发展历史最悠久的收集器。这个收集器是一个单线程的收集器,单线程的意义并不是说明她只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是她在进行垃圾收集时,必须暂停其他所有的工作线程,直到她收集结束。

运行过程如图:

 

ParNew 收集器

    parNew 收集器其实就是Serial 收集器的多线程版本,除了使用多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数,收集算法,Stop The World对象分配规则、回收策略等都和Serial 收集器完全一样。

 

Parallel Scavenge 收集器

    Parallel Scavenge 收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器,看上去与ParNew 都一样。

    Parellel Scavenge 收集器的特点是它关注点与其他收集器不同,CMS 等收集器关注点是尽可能地缩短垃圾收集器是用户线程的停顿时间,而Paraller Scavenge 收集器的目标则是达到一个可控制的吞吐量。

 

 吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集器时间)

 

吞吐量即使cpu 用于运行用户代码的时间与cpu总消耗的时间的比值。

 

Serial Old 收集器

    Serial old 是Serial 收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法。主要意义也是在于Client 模式下虚拟机使用。

 

Parallel Old 收集器

显然这个收集器是Parallel Scavenge 收集器的老年代版本,使用多线程和标记-整理算法。

 

CMS 收集器

    CMS(Concurrent Mark Sweep) 收集器是一种以获得最短回收停顿时间为目标的收集器。CMS 收集器是基于“标记-清除”算法实现的,他的运作过程相当于前面集中收集器来说更复杂一些,整个过程分为4个步骤:

    初始标记(CMS initial mark),并发标记(CMS concurrent mark),重新标记(CMS remark),并发清除(CMS concurrent sweep)。

    初始标记与重新标记 两个步骤需要“Stop The World”。初始标记仅仅只是标记一下GC Roots 能直接关联的对象,速度很快。并发标记阶段就是进行GC Roots Tracing 的过程。重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致标记产生的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记时间短。

CMS收集器的优点:并发收集、低停顿。

CMS收集器的缺点:

    1.CMS收集器对CPU资源非常敏感。

  2.CMS收集器无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。

    3.CMS 是基于“标记-清除”算法实现的收集器,意味着收集结束是会产生大量的空间碎片产生。解决这个问题CMS收集器提供了一个-XX:+UseCMSCompactAtFullCollection 开关参数,用于在CMS收集器顶不住要进行FUllGC时开启内存碎片的合并整理过程,内存整理的过程是无法并发的,空间碎片问题没了,但停顿时间不得不边长。

 

G1 收集器

    G1 是一款面向服务端应用的垃圾收集器。

G1与其他GC收集器相比较,具有如下特点:

    并发与并行、分代收集、空间整合、可预测的停顿。

在不计算维护Remembered Set 的操作,G1 收集器的运作大致可分为一些几个步骤:

    初始标记、并发标记、最终标记、筛选回收。

    初始标记阶段仅仅只是标记一下GC Roots 能直接关联到的对象,并且修改TAMS的值,让下一阶段用户程序并发运行,能在正确可用的Region 中创建对象,这阶段需要停顿线程,但耗时横短。

    并发标记阶段是从GC Root开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但是可与用户程序并发执行。

    而最终标记阶段则是为了修正在并发标记期间因用户进程继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间按对象变化记录在线程Remembered Set Logs里面,最终标记需要把Remembered Set Logs 的数据合并到Remembered Set中,这阶段需要停顿线程,但是可并发执行。

    筛选回收阶段首先对各个Region 的回收价值和成本进行排序,这个阶段也可以做到与用户进程一起并发执行,但是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅度提高收集效率。

    

    

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值