垃圾收集器CMS&ParNew
2021-08-18 13:50:25 0 举报
主要讲述垃圾收集器CMS和ParNew
作者其他创作
大纲/内容
用户线程
CMS线程
Parallel
CMS收集器:
垃圾收集底层算法实现
年轻代
ParNew:ParNew收集器其实跟Parallel收集器很类似,区别主要在于它可以和CMS收集器配合使用。新生代采用复制算法,老年代采用标记-整理算法。
Serial
并发清理: 开启用户线程,同时GC线程开始对未标记的区域做清扫。这个阶段如果有新增对象会被标记为黑色不做任何处理(见下面三色标记算法详解)。
并发标记时对漏标的处理方案如下:CMS:写屏障 + 增量更新G1,Shenandoah:写屏障 + SATB(原始快照)ZGC:读屏障
ZGC
标记整理算法:标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。整理为一段连续的空间碎片
初始标记:需要stw,耗时极短,主要记录jgc roots直接引用的对象(例如:常量和静态变量)
标记清除算法:算法分为“标记”和“清除”阶段:标记存活的对象, 统一回收所有未被标记的对象(一般选择这种);也可以反过来,标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象 。它是最基础的收集算法,比较简单,但是会带来两个明显的问题:1.效率问题 (如果需要标记的对象太多,效率不高)2.空间问题(标记清除后会产生大量不连续的碎片)
垃圾收集算法
Parallel Old
CMS收集器:CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。CMS收集器是一种 “标记-清除”算法实现的
Serial:Serial(串行)收集器是最基本、历史最悠久的垃圾收集器了,它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( \"Stop The World\" ),直到它收集结束。新生代采用复制算法,老年代采用标记-整理算法。
并发清理
并发重置
标记清除算法
Serial Old
分代收集理论:就是根据对象存活周期不同将内存分为几块,例如java堆分为新生代和老年代,新生代采用复制算法,老年代采用标记整理或者标记清除算法
老年代
复制算法:将内存分为两块大小相同区域,当一块区域内存填满,将存活对象复制到另外一块区域,再清除这块区域。优点:效率高,清理完成是连续空间,缺点:浪费内存
CMS存在的问题:1.对CPU资源敏感(会和服务抢资源);2无法处理浮动垃圾(只能等到下一次gc再清理了);3.它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生;4.执行过程中的不确定性,会存在上一次垃圾回收还没执行完,然后垃圾回收又被触发的情况,特别是在并发标记和并发清理阶段会出现span style=\"font-size: inherit;\
重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短。主要用到三色标记里的增量更新算法(见下面详解)做重新标记。
G1
ParNew
并发标记: 并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程, 这个过程耗时较长但是不需要停顿用户线程,可能产生的问题,标记过的对象会发生变化
复制算法
Parallel:Parallel收集器其实就是Serial收集器的多线程版本,Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)。CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。新生代采用复制算法,老年代采用标记-整理算法。(JDK8默认的新生代和老年代收集器)
重新标记
分代收集理论
CMS
标记整理算法
并发标记
初始标记
垃圾收集器
收藏
收藏
0 条评论
下一页