stw:垃圾回收的时候,工作线程全部停止
新生代三款:
serial: 单线程。stw。复制算法。新生代。
适合单线程应用和客户端模式。
ParNew:多线程(垃圾回收的时候使用多线程)。stw。新生代。
适合多处理器环境。
Parallel Scavenge:吞吐量优先(保证用户线程能够占用更多的运行时间),有参数可以控制最大gc时间以及gc占用的时间比例。
多线程(垃圾回收的时候使用多线程)。stw。复制算法。新生代。
适合大规模后台任务,注重吞吐量而非延迟。
老年代三款:
CMS:垃圾回收线程和用户线程同时运行。标记-清除算法。老年代。
缺点:内存碎片 + 浮动垃圾
追求低延迟。适合对响应时间要求较高的应用。
Serial Old:单线程,stw,标记-整理算法,老年代。
适合单线程应用以及低内存场景。
Parallel old:多线程。stw。标记-整理算法,老年代。
适合大规模后台任务,注重吞吐量而非延迟。
G1:追求低延迟,可预测的停顿时间,用于取代cms。
分区来管理内存,垃圾回收时优先收集最有价值的区域。
整体来看,采用的是标记-整理算法,两个region之间采用的是复制算法。没有内存碎片。
适合大内存,多cpu的服务器应用。
ZGC:
低延迟、高吞吐量的垃圾收集器。停顿时间一般不会超过10毫秒。
适合大内存并且对低延迟要求极高的应用。
=搭配==
serial 和 serial old配合使用。
parnew 和 cms 配合使用。
Parallel Scavenge 和 Parallel old配合使用。jdk 1.8默认的组合。
==cms四个阶段=
1.初始标记:标记gc roots能直接关联到的对象,stw,耗时短
2.并发标记:从gc roots能直接关联到的对象开始遍历整个对象图。耗时长,但是不需要stw。
3.重新标记:采用增量更新算法,对并发标记阶段因为用户线程的运行而产生变化的对象,重新进行标记。需要stw,但是耗时短。
4.并发清除:并发清除掉垃圾对象,不需要stw。
优点:并发标记以及并发清除节点,不需要stw,所以停顿时间短。
缺点:内存碎片 + 浮动垃圾
内存碎片:因为采用的是标记-清除算法,不会进行内存整理,所以会产生内存碎片。
浮动垃圾:并发清理阶段,用户线程在继续运行,新产生的垃圾没办法进行处理,只能等待下一次垃圾回收处理。
==G1四个阶段=
1.初始标记:标记gc roots能直接关联到的对象,stw,耗时短。还会修改TAMS(top at mark start)指针.
TAMS: G1为每个region都设计了两个TAMS指针,新分配的对象必须位于这两个指针位置以上;位于这两个位置以上的对象默认被标记为存活,不纳入回收范围。
2.并发标记:从gc roots能直接关联到的对象开始遍历整个对象图。遍历完成,还会处理SATB记录的发生变动的对象。
SATB:能够有效的解决并发标记阶段,因为用户线程运行而导致的对象变动。效率比cms重新标记阶段使用的增量更新高。
3.最终标记:stw,处理并发阶段遗留下来的少量的SATB记录。
4.筛选回收:计算各个region回收的价值,选择回收价值大的进行回收。将一个region中存活的对象,复制到另一个region中,然后清空旧的region。因为需要复制存活的对象,所以是stw的,防止用户线程干扰。