前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GC 收集器

GC 收集器

原创
作者头像
Get
发布2024-03-20 21:32:19
930
发布2024-03-20 21:32:19

1、Serial 收集器(新生代、复制算法)

代码语言:java
复制
新生代单线程收集器,只使用 一条线程 完成垃圾收集,GC 线程工作时,其它所有线程都将停止工作。
优点:效率高,对于限定单CPU环境来说,Serial收集器没有线程交互开销(专一做垃圾收集),拥有更高的单线程收集效率。
应用场景:客户端模式下,虚拟机的 新生代区域
定义:-XX:+UseSerialGC

2、Serial Old 收集器(标记-整理算法)

代码语言:java
复制
老年代单线程收集器,Serial收集器的老年代版本,是client级别默认的GC方式
定义:-XX:+UseSerialOldGC
应用场景:
1、在客户端模式下,虚拟机的老年代区域
2、在服务器模式下:与 Parallel Scavenge 收集器搭配使用

3、ParNew 收集器(新生代、复制算法)

代码语言:java
复制
ParNew 是 Serial收集器的多线程版本;并发收集,在进行垃圾收集时,必须暂停其他所有工作线程(Stop The World),直到收集结束。
Server 场景下默认的新生代收集器,除了性能原因外,主要是因为除了 Serial 收集器,只有它能与 CMS 收集器配合使用。
优点:并发进行垃圾收集
缺点:ParNew 在单核环境下是不如 Serial 的,在多核的条件下才有优势。
定义:-XX:+UseParNewGC
应用场景:服务器模式下,虚拟机的 新生代区域

4、Parallel Scavenge 收集器(新生代、复制算法)

代码语言:java
复制
ParNew?收集器的升级版,多线程的收集器,它的目标是提高吞吐量 (吞吐量 = 运行用户程序的时间 / (运行用户程序的时间 + 垃圾收集的时间))
停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。
而高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,适合在后台运算而不需要太多交互的任务。
优点:
    1、可控制吞吐量:其他收集器的目标是:?尽可能缩短 垃圾收集时间,而Parallel Scavenge收集器的目标则是:达到 可控制吞吐量
    2、自适应(GC?自适应的调节策略):该垃圾收集器能根据当前系统运行情况,动态调整自身参数,从而达到最大吞吐量的目标。
定义:-XX:+UseParallelGC
应用场景:服务器模式下,虚拟机的 新生代区域

5、Parallel Old 收集器(老年代、标记整理算法)

代码语言:java
复制
Parallel Scavenge 收集器的老年代版本
特点:以达到 可控制吞吐量 为目标、自适应调节、多线程收集
在注重吞吐量的场景下,可以采用 Parallel Scavenge + Parallel Old 的组合。
定义:-XX:+UseParallelOldGC
应用场景:服务器模式下,虚拟机的 老年代区域

https://blog.csdn.net/a303549861/article/details/88744333

https://www.jianshu.com/p/e5d2435a9122

6、CMS(Concurrent Mark Sweep、标记-清除算法)

代码语言:java
复制
GMS 使用的算法是:三色标记 + Incremental-Update + 写屏障
G1 使用的算法是:三色标记 + SATB + 写屏障
CMS 收集器几乎占据着 JVM 老年代收集器的半壁江山,它划时代的意义就在于垃圾回收线程几乎能做到与用户线程同时工作。
CMS 收集器的目标是:?获取最短回收停顿时间,即希望系统停顿的时间最短,提高响应速度(用户线程 & 垃圾收集线程同时进行)。
工作流程主要有如下 4 个步骤:
1、初始标记(initial mark):标记那些和GC ROOT直接连接的对象,存在STW,但是STW时间很短
2、并发标记(concurrent mark):进行 GC Roots Tracing 的过程,它在整个回收过程中耗时最长,不需要停顿
3、重新标记(remark):因为并发标记时会造成漏标(三色标记中会讲到),必须重新标记,存在STW
                    停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短
4、并发清除(concurrent sweep):用户线程工作的同时,GC线程清理垃圾,不需要停顿
在整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,不需要进行停顿。
由于整个过程中,耗时最长的并发标记 和 并发清除过程都可与用户线程一起进行所以,CMS收集器的垃圾收集过程可看作是与用户线程 并发执行的
优点:并发收集、低停顿
缺点:
    1、吞吐量低:在并发阶段,它虽然不会导致用户线程停顿,但会因为占用了一部分线程(或者说CPU资源)而导致应用程序变慢,总吞吐量会降低。
    2、无法处理浮动垃圾:由于 并发清理时 用户线程还在运行,所以会有新的垃圾不断产生(即浮动垃圾),只能等到留待下一次GC时再清理掉。
                       可能出现 "Concurrent Mode Failure" 失败而导致另一次Full GC的产生。
    3、标记-清除算法导致的空间碎片:CMS是一款基于“标记-清除”算法实现的收集器,这意味着收集结束时会有大量空间碎片产生。
                                 空间碎片过多时,将会给大对象分配带来很大麻烦,往往出现老年代空间剩余,但无法找到足够大连续空间来分配当前对象。
定义:-XX:+UseConcMarkSweepGC
https://www.cnblogs.com/rumenz/articles/14093682.html
CMS是一个很好的并发垃圾收集器,但是使用过程中会产生两个重要的问题。
1、promotion failed 晋升失败
2、concurrent mode failure 收集器无法处理浮动垃圾
1、promotion failed 晋升失败原因
   该问题发生在Minor GC过程中,Survivor Space放不下转移的对象,老年代也放不下(promotion failed发生的时候老年代CMS还没有机会进行回收,
   又放不下转移到老年代的对象,下一步就会产生concurrent mode fialure,发生STW降级为Serial Old)
2、concurrent mode failure产生的原因
   concurrent mode failure是CMS特有的错误,CMS的垃圾清理线程和用户线程是并行进行的. 老年代正在清理,从年轻代晋升了新对象,
   或者分配的大对象在新生代放不下,直接在老年代分配内存,这时老年代也放不下,则会抛出concurrent mode failure
3、concurrent mode failure的影响
  老年代的垃圾收集器从CMS退化成Serial Old,所有用户线程被暂停,停顿时间变长。

7、Full GC

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com