垃圾回收器分类
按线程分:
1.串行垃圾回收器。
2.并行垃圾回收器
按工作模式分:
1.并发式垃圾回收器
2.独占式垃圾回收器:GC时STW。
按碎片处理分:
1.压缩式垃圾回收器:压缩整理,清理碎片
2.非压缩式垃圾回收器:没有压缩整理。
按工作的内存分:
1.老年代垃圾回收器
2.年轻代垃圾回收器
评估GC的指标
吞吐量:运行用户代码的时间占总运行时间的比例。(总运行时间=程序运行时间+内存回收时间)
垃圾开销:吞吐量的补数。
暂停时间:STW的时间
收集频率:收集操作的频率
内存占用:占用java堆区内存大小
快速:对象诞生到被回收经历的时间。
现在的标准:在最大吞吐量优先的情况下,降低暂停时间
常见的垃圾回收器
串行回收器:Serial,Serial Old
并行回收器:ParNew, Parallel Scavenge,Parallel old
并发回收器;CMS,G1
新生代收集器:Serial,ParNew,Parallel Scavenge
老年代收集器:Serial Old,Parallel old,CMS
整堆收集器:G1
垃圾回收器组合:新生代+老年代(或整堆)
Serial和Serial Old回收器
串行,并不是说只有一个CPU,重点是,要暂停其他所有线程,回收器本身是单线程的
Serial采用复制算法,Serial Old采用标记压缩算法。采用STW机制
ParNew回收器
并行,新生代,复制算法,STW机制
多线程垃圾回收器(可以手动设定)
Parallel Scavenge回收器
并行,新生代,复制算法,STW机制
他的目标是可控制吞吐量(吞吐量优先),适用于后台,吞吐量大,性能好。
自适应调节策略(高吞吐还是低延时)是Parallel和ParNew的重要区别。
Parallel Old回收器
并行,新生代,标记压缩,STW
配合Parallel使用
CMS垃圾回收器
Concurrent(并发) Mark Sweep
并发,老年代,标记-清除算法,STW
优点:用户线程和CMS同时工作,低延时
缺点:产生内存碎片,导致吞吐量变低,无法处理浮动垃圾(在并发标记阶段产生的垃圾,注:重新标记指的是对已标记的垃圾重新判定)
1.初始标记
所有线程STW,标记出和GC Roots直接关联的对象,标记完成,恢复线程,速度很快。
2.并发标记
从直接关联的对象开始遍历所有关联对象,耗时较长,并发执行,但不需SWT
3.重新标记
因为并发标记时工作线程没有停顿,为了修正并发标记期间产生变动的对象。STW,比初始标记时间长一些,远比并发标记时间短。
4.并发清除
由于不需要移动对象,可以与工作线程并发,清理带标记的对象。
5.重置线程
G1垃圾回收器(jkd9后完全取代CMS)
Garbage First(G1)
诞生原因:想要兼顾吞吐量和暂停时间。
并行,侧重于垃圾多的区域
G1把内存划分成不同区域,eden,survivor0,survivor1,old
G1跟踪各区域的垃圾堆积的价值大小(垃圾越多,用时越少,价值越大),后台维护一个优先列表,根据允许的收集时间,优先回收最大价值的区域。
优点:
并行和并发兼顾:可以多线程GC,需要STW,也可以并发GC。
分代分区:eden,survivor0,survivor1,old不要求物理连续,可以分开。
空间整合,整体上可看做标记压缩算法
可预测停顿时间模型:预测各个区域的垃圾大小和回收时间,维护一个优先列表,根据允许的收集时间,优先回收最大价值的区域
缺点:
垃圾回收时占用较大内存
G1比CMS多个记忆集(占用内存)
G1适用场景
适用于内存大,需要低延时的场景
分区思想
所有Region大小相同。
所有区域充当的角色在被清除后可改变。
G1增加了增加了一种新的的内存区域 Humongous ,如果要存储大对象。超过任何区域的1.5倍就是大对象。
原因:原本大对象默认分配到老年代,如果是一个短期存在的大对象,会对垃圾回收有负面影响,所有放在H区
G1回收过程
1.年轻代GC
2.老年代并发标记过程
3.混合回收
4.Full GC(可能发生)
G1记忆集与写屏障
每个Region都有记忆集。
如果回收新生代时,不得不扫描老年代是否有引用
所以,使用记忆集,记忆集记录哪些引用指向了新生代的对象,不用全堆遍历。
写屏障:每当有引用类型写入记忆集时,都会产生写屏障暂时中断操作,检查这个引用是否在本身的Region,如果不在,则使用卡表(记忆集中的实现形式)把引用信息记录到记忆集中。
G1回收详细过程
回收过程一:年轻代GC
1.扫描根
2.更新记忆集
3.处理记忆集
4.复制对象
5.处理引用
回收过程二:并发标记
1.初始标记(STW)
2.根分区扫描
3.并发标记
4.重新标记(STW)
5.独占清理(STW)
6.并发清理
回收过程三:混合回收
看不懂,过
回收过程思:Full GC
1.并发清理过程中,产生垃圾速度比回收垃圾速度快,导致空间耗尽,那么会出现Full Gc
2.堆区内存太小,复制对象去to区时没有足够空间