垃圾收集器

来源:互联网 发布:游戏音效制作软件 编辑:程序博客网 时间:2024/05/21 06:00
1.CMS收集器(标记清除)
    是一种以获取最短回收停顿时间为目标的收集器。基于标记清除算法实现,整个过程分为以下4个步骤:
    (1)初始标记:仅仅只标记一下GC Roots能直接关联的对象,速度很快;
    (2)并发标记:进行GC Roots Tracing;
    (3)重新标记:修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,比初始标记时间稍长,但远比并发标记段。
    (4)并发清除;
    耗时最长的并发标记和并发清楚都可以和用户线程一起工作。

    缺点:
    (1)CMS收集器对CPU资源非常敏感
    (2)无法处理浮动垃圾,可能出现Concurrent Mode Failure失败而导致另一次的Full GC。由于CMS并发清理阶段用户线程还在运行,伴随程序运行自然就会有新的垃圾不断产生,CMS无法在当次收集中处理掉他们,只好留待下一次GC时再清理。所以需要预留一部分空间存储这部分垃圾,当预留的内存无法满足程序需求,就会出现一次Concurrent Mode Failure失败。
    (2)标记清楚算法将会产生大量空间碎片。

2.G1收集器(标记整理)
    特点:
    (1)并行与并发:G1能充分利用多CPU、多核环境下的硬件优势
    (2)分代收集:采用不同的方式处理新建对象和已存活对象
    (3)空间整合:基于标记整理算法实现,不会产生空间碎片
    (4)可预测停顿:G1除了追求低停顿外,还能建立可预测的时间停顿模型
    G1将整个Java堆分为多个大小相等的独立区域,虽然还保留新生代和老年代的概念,但新生代和老年代不再是物理隔离了,它们都是一部分Region的集合。G1跟踪各个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许收集的时间,优先回收价值最大的Region。
    G1使用Remembered Set来避免全堆扫描,G1中每个Region都有一个与之对应的Remembered Set,当一个对象被引用时就会把相关引用信息记录到被引用对象所属的Region的Remembered Set之中,在进行垃圾回收时,就不会进行全堆扫描。
    
    步骤:
    (1)初始标记:仅仅只标记一下GC Roots能直接关联的对象,耗时很短
    (2)并发标记:从GC Root开始对堆中对象进行可达性分析,找出存活的对象,耗时较长,但可与用户线程并发执行。
    (3)最终标记:修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,更新Remembered Set
    (4)筛选回收:对Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划
    
     
0 0
原创粉丝点击