目录
常见的垃圾回收器
串行垃圾收集器
并行垃圾收集器
并发垃圾收集器
总结
CMS的介绍
G1的介绍
特点
四个阶段
常见的垃圾回收器
并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程处于STW状态。
并发(Concurrent):指用户线程与垃圾收集线程同时执行,用户线程绝大部分时间是运行状态。可能会出现极短时间的STW状态
串行垃圾收集器
Serial(读音:西瑞哦)收集器(复制算法):新生代单线程收集器,标记和清理都是单线程,优点是简单高效;全程STW
Serial Old收集器 (标记-整理算法):老年代单线程收集器,Serial收集器的老年代版本;全程STW
并行垃圾收集器
ParNew(读音:帕尔纽)收集器 (复制算法): 新生代收并行集器,实际上是Serial收集器的多线程版本,在多核 CPU环境下有着比Serial更好的表现;全程STW
Parallel Scavenge(读音:帕瑞勒 斯凯文吉)收集器 (复制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU;全程STW
Parallel Old收集器 (标记-整理算法): 老年代并行收集器,吞吐量优先,Parallel Scavenge收集器的老年代版本;全程STW
并发垃圾收集器
CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并发收集器,以获取最短回收停顿时间为目标的收集器,具有并发收集、低停顿的特点,追求最短GC回收停顿时间。
G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一 个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。
总结
新生代收集器:Serial、 ParNew 、 Parallel Scavenge
老年代收集器: CMS 、Serial Old、Parallel Old
整堆收集器: G1
CMS的介绍
CMS是老年代并发垃圾收集器, 采取标记清除算法, 追求最短GC回收停顿时间, 优点是并发收集, 低停顿.
CMS 处理过程有四个步骤:
初始标记,指的是寻找所有被 GCRoots 引用的对象,该阶段需要STW。这个步骤仅仅只是标记一下 GC Roots 能直接关联到的对象,并不需要做整个引用的扫描,因此速度很快。
并发标记,指的是对「初始标记阶段」标记的对象进行整个引用链的扫描,该阶段与用户线程同时运行, 不需要STW
重新标记,指的是对「并发标记」阶段出现的问题进行校正,该阶段需要STW.由于垃圾回收算法和用户线程并发执行,虽然能降低响应时间,但是会发生漏标(存活对象被标为垃圾)和多标(垃圾对象被标为存活)的问题。
并发清除,指的是将标记为垃圾的对象进行清除,该阶段与用户线程同时运行, 不需要STW.CMS 之所以能极大地降低 GC 停顿时间,本质上是将原本冗长的引用链扫描进行切分。通过 GC 线程与用户线程并发执行,加上重新 标记校正的方式,减少了垃圾回收的时间。
CMS缺点
多线程并发处理, 吃CPU资源
无法处理浮动垃圾, 在 CMS 进行并发清理的时候,用户线程同时在运行,也会产生一些浮动垃圾。
采用标记清除算法会产生空间碎片
G1的介绍
特点
同时注重吞吐量(Throughput)和低延迟(Low latency)
将堆内存化整为零,会将堆划分为多个大小相等的Region, 内存的回收是以region作为基本单位的
Region是 G1 垃圾收集器的核心设计概念。简单说,Region 是 G1 将整个堆内存划分成的大小相等的内存块,这是 G1 与之前所有收集器的根本区别。
整体上看是标记整理算法,微观上看两个区域之间是复制算法
四个阶段
初始标记 (需要STW)
标记了从GC Root开始直接关联可达的对象
并发标记(不需要STW)
在老年代占用堆空间比例到达阈值时, 从GC Root开始对堆中对象进行可达性分析, 递归扫描整个堆里的对象图, 标记出所有回收对象
和用户程序并发执行, 不会STW
最终标记 (需要STW)
由于并发标记阶段允许用户线程工作,可能会出现漏标,错标问题
使用SATB算法处理漏标问题,错标允许存在,下次回收即可
确定本次要回收的Region集合
筛选回收 (需要STW)
先对Region的回收价值进行排序,然后根据期望暂停时间,选择性回收Region
不追求一次全部清理完, 优先回收垃圾最多的区域
回收时采用复制算法,多条收集器线程并发执行