Serial收集器
优点:简单而高效(与其他收集器的单线程相比)。Serial收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率。
缺点:Stop The World
新生代采用复制算法,老年代采用标记-整理算法。
ParNew收集器:
ParNew收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为(控制参数、收集算法、回收策略等等)和Serial收集器完全一样。
Parallel Scavenge收集器:
Parallel Scavenge 收集器类似于ParNew 收集器,是Server 模式(内存大于2G,2个cpu)下的默认收集器
特点:
Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)。
所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值
CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。
Serial Old收集器:
Serial收集器的老年代版本
Parallel Old收集器:
Parallel Scavenge收集器的老年代版本。
CMS收集器(-XX:+UseConcMarkSweepGC(主要是old区使用)):
CMS(Concurrent Mark Sweep——标记-清除)收集器是一种以获取最短回收停顿时间为目标的收集器。
它而非常符合在注重用户体验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作
过程:
优点:
并发收集、低停顿
缺点:
1.对CPU资源敏感(会和服务抢资源)
2.无法处理浮动垃圾(在java业务程序线程与垃圾收集线程并发执行过程中又产生的垃圾,这种浮动垃圾只能等到下一次gc再清理了);
3.它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生
G1收集器(-XX:+UseG1GC):
G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.
G1将Java堆划分为多个大小相等的独立区域(Region),虽保留新生代和老年代的概念,但不再是物理隔阂了,它们都是(可以不连续)Region的集合。
分配大对象(直接进Humongous区,专门存放短期巨型对象,不用直接进老年代,避免Full GC的大量开销)不会因为无法找到连续空间而提前触发下一次GC。
特点:
并行与并发:
G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间。部分其他收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。
分代收集:
虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念
空间整合:
与CMS的“标记--清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。
可预测停顿:
G1收集器的运作大致分为以下几个步骤:
初始标记(initial mark,STW):
在此阶段,G1 GC 对根进行标记。该阶段与常规的 (STW)年轻代垃圾回收密切相关
并发标记(Concurrent Marking):
G1 GC 在整个堆中查找可访问的(存活的)对象
最终标记(Remark,STW):
该阶段是 STW 回收,帮助完成标记周期
筛选回收(Cleanup,STW):
筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划,这个阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅提高收集效率
G1垃圾收集分类:
YoungGC:
1.新对象进入Eden区
2.存活对象拷贝到Survivor区
3.存活时间达到年龄阈值时,对象晋升到Old区
MixedGC:
1.不是FullGC,回收所有的Young和部分Old(根据期望的GC停顿时间确定old区垃圾收集的优先顺序)
2.global concurrent marking (全局并发标记)
2.1.Initial marking phase:标记GC Root,STW
2.2 Root region scanning phase:标记存活Region
2.3.Concurrent marking phase:标记存活的对象
2.4 Remark phase :重新标记,STW
2.5.Cleanup phase:部分STW