几种垃圾回收器

垃圾回收器分类

按线程分:

1.串行垃圾回收器。

2.并行垃圾回收器

按工作模式分:

1.并发式垃圾回收器

2.独占式垃圾回收器:GC时STW。

按碎片处理分:

1.压缩式垃圾回收器:压缩整理,清理碎片

2.非压缩式垃圾回收器:没有压缩整理。

按工作的内存分:

1.老年代垃圾回收器

2.年轻代垃圾回收器

评估GC的指标

吞吐量:运行用户代码的时间占总运行时间的比例。(总运行时间=程序运行时间+内存回收时间

垃圾开销:吞吐量的补数。

暂停时间:STW的时间

收集频率:收集操作的频率

内存占用:占用java堆区内存大小

快速:对象诞生到被回收经历的时间。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CEtH1LKA-1628510710730)(C:\Users\14584\Documents\Tencent Files\1458495983\FileRecv\Screenshot_20210530_030632.jpg.jpg)]

现在的标准:在最大吞吐量优先的情况下,降低暂停时间

常见的垃圾回收器

串行回收器: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区时没有足够空间

七种垃圾回收器总结
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值