目录
Serial收集
ParNew收集器
Parallel Scavenge收集器
Serial Old收集器
Parallel Old收集器
CMS垃圾收集器(重点):
Garbage First 收集器(重点):
Serial收集
使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。
ParNew收集器
ParNew 收集器除了支持多线程并行收集之外,其他与 Serial 收集器相比并没有太多创新之处,但它却是不少运行在服务端模式下的 HotSpot 虚拟机,尤其是 JDK 7 之前的遗留系统中首选的新生代收集器,其中有一个与功能、性能无关但其实很重要的原因是:除了Serial 收集器外,目前只有它能与 CMS收集器配合工作。
Parallel Scavenge收集器
同样是基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器,Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能 地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值
Serial Old收集器
Serial Old 是 Serial 收集器的老年代版本,它同样是一个单线程收集器,使用标记 - 整理算法。
Parallel Old收集器
Parallel Old 是 Parallel Scavenge 收集器的老年代版本,支持多线程并发收集,基于标记 - 整理算法实现
CMS垃圾收集器(重点):
基于标记清除算法实现,整体过程分为四个步骤:
初始标记:仅仅只是标记一下 GC Roots能直接关联到的对象,速度很快;
并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程(与垃圾收集线程一起并发运行)
重新标记:为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
并发清除:清理删除掉标记阶段判断的已经死亡的对象(与用户线程同时并发)
优点:并发收集,低停顿
缺点:1、CMS收集器对处理器资源非常敏感,多并发导致程序变慢
2、无法清除浮动垃圾
3、基于 “ 标记 - 清除 ”算法实现的收集器,会有大量空间碎片产生。
Garbage First 收集器(重点):
G1 开创的基于 Region 的堆内存布局。
其堆内存的布局与其他收集器有非常明显的差异:
G1 不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java 堆划分为多个大小相等的独立区域( Region ),每一个 Region 都可以 根据需要,扮演新生代的 Eden 空间、 Survivor 空间,或者老年代空间。收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。
四个步骤:
初始标记:标记了从GC Root开始直接关联可达的对象。STW(Stop theWorld)执行。
并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程(找出要回收的对象)(与垃圾收集线程一起并发运行)
最终标记:STW,标记在并发标记过程中产生的垃圾。=重新标记(标记的范围更小)
筛选回收:制定回收计划,选择多个Region 构成回收集,把回收集中Region的存活对象复制到空的Region中,再清理掉整个旧日Region的全部空间。需要STW