JVM垃圾收集器简介

1.Serial收集器**(-XX:+UseSerialGC -XX:+UseSerialOldGC)**

Serial(串行)收集器是最基本、历史最悠久的垃圾收集器了。

新生代采用复制算法,老年代使用标记-整理算法。

一种用途是在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用,另一种用途是作为CMS收集器的后备方案。

2.Parallel Scavenge收集器**(-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代))**

parallel Scavenge收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为(控制参数、收集算法、回收策略等等)和Serial收集器类似。默认的收集线程数跟CPU相同。

Paralle Scavenge收集器关注点是吞吐量(高效利用CPU)。CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值。

3.ParNew收集器**(-XX:+UseParNewGC)**

ParNew收集器其实跟Paralle收集很类似,区别主要在于它可以和CMS收集器配合使用。

它是许多运行在Server模式下虚拟机的首要 选择,除了Serial收集器外,只有它能与CMS收集器配合工作。

4.CMS收集器**(-XX:+UseConcMarkSweepGC(old))**

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。

它是一种使用标记-清楚算法的垃圾收集器。整个过程分为四个步骤:

  1. 初始标记:暂停所有其他线程(STW),并记录下GC Root直接能引用的对象,速度很快。
  2. 并发标记:并发标记阶段就是从GC Root的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集器线程一起并发运行。因为用户程序继续运行,可能会有导致已经标记过的对象状态发生改变。
  3. 重新标记:重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生标动的那一部分对象的标记记录(主要是处理漏标问题),这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短。主要用到三色标记里的增量更新算法
  4. 并发清理:开启用户线程,同时GC线程开始对未标记的区域做清扫。这个阶段如果有新增对象会被标记为黑色不做任务处理
  5. 并发重置:重置本次GC过程中的标记数据。

主要优点:并发收集、低停顿。

明显缺点:

  1. 对CPU资源敏感(会和用户线程抢资源)
  2. 无法处理浮动垃圾(在并发标记和并发清理阶段又产生垃圾,这种浮动垃圾只能等到下一次gc再清理);
  3. 它使用的回收算法-"标记-清除"算法会导致收集结束时会有大量的空间碎片产生,当然通过参数XX:+UseCMSCompactAtFullCollection可以让jvm在执行完标记清除后再做整理
    4. 执行过程中的不确定性,会存在上一次垃圾回收还没执行完,然后垃圾回收又被触发的情况,特别是在并发标记和并发清理阶
    段会出现,一边回收,系统一边运行,也许没回收完就再次触发 full gc ,也就是 " concurrent mode failure " ,此时会进入stop the world,用 serial old垃圾收集器来回收
相关推荐
秋天的怀念_David9 分钟前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool11226613 分钟前
网络编程^
java
薛定e的猫咪15 分钟前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪37 分钟前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
Thinker QAQ1 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
齐 飞1 小时前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
你的保护色1 小时前
多AS互联BGP4综合实验设计
java
某不知名網友2 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
Wang's Blog2 小时前
Java 项目实战: 交友项目 - MongoDB 入门:体系结构和命令行操作
java·mongodb·交友
小溪学编程2 小时前
将 Bean 放入 Spring 容器中的方式有哪些?
java·后端·spring