jvm垃圾收集器之七种武器
目录
1.回收算法
1.1 标记-清除算法(Mark-Sweep)
1.2 复制算法(Copying)
1.3 标记-整理算法(Mark-Compact)
2.HotSpot虚拟机的垃圾收集器
2.1 新生代的收集器
Serial 收集器(复制算法)
ParNew 收集器 (复制算法)
Parallel Scavenge 收集器 (复制算法)
2.2 老年代的收集器
Serial Old 收集器 (标记-整理算法)
Parallel Old 收集器 (标记-整理算法)
CMS(Concurrent Mark Sweep)收集器(标记-清除算法)
2.3 整个堆
G1(Garbage First)收集器 (标记-整理算法)
1.回收算法
1.1 标记-清除算法(Mark-Sweep)
分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。

该算法最大的问题是内存碎片化严重,后续可能发生大对象不能找到可利用空间的问题。
1.2 复制算法(Copying)
按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。

这种算法虽然实现简单,内存效率高,不易产生碎片,但是最大的问题是可用内存被压缩到了原本的一半。且存活对象增多的话,Copying算法的效率会大大降低。
1.3 标记-整理算法(Mark-Compact)
标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。

2.HotSpot虚拟机的垃圾收集器

展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。
2.1 新生代的收集器
Serial 收集器(复制算法)
新生代单线程收集器,标记和清理都是单线程,
优点:
简单高效:对于有限的资源环境,Serial 收集器由于其简单的算法和单线程的执行方式,在垃圾收集上能够达到一定的效率。
易于实现:没有多线程间同步的复杂性,使得Serial 收集器相对容易实现和维护。
缺点:
停顿时间:所有工作线程在垃圾收集时都需要暂停,这可能导致应用响应时间变长,特别是堆内存较大时,GC停顿时间会更加明显。
不适合多核处理器:在多核处理器系统上,由于Serial 收集器只能使用单个核心进行垃圾收集,无法充分利用现代硬件资源。
Serial/Serial Old收集器运行示意图

ParNew 收集器 (复制算法)
新生代并行收集器,实际上是 Serial 收集器的多线程版本
使用-XX:+UseParNewGC(新生代使用并行收集器,老年代使用串行回收收集器) 或者-XX:+UseConcMarkSweepGC(新生代使用并行收集器,老年代使用 CMS)
优点:
- 多线程收集:ParNew 收集器能够并行地使用多个线程进行垃圾收集,这使得它在多核处理器上相较于 Serial 收集器具有更好的性能表现。
- 适合多核环境:随着现代服务器通常配备多核处理器,ParNew 收集器能够更有效地利用这些处理器资源,提高垃圾收集的效率。
- 与CMS兼容:ParNew 收集器经常与老年代的 Concurrent Mark Sweep (CMS) 收集器配合使用,为需要低停顿时间且具有多核处理器的应用提供了一种有效的垃圾收集解决方案。
- 适用于交互式应用:由于 ParNew 收集器能够减少垃圾收集时的停顿时间,它特别适合于对响应时间有较高要求的交互式应用。
缺点:
- 消耗更多的CPU资源:虽然 ParNew 收集器通过并行收集减少了停顿时间,但这也意味着在垃圾收集过程中会使用更多的CPU资源,可能会对应用程序的其他部分造成影响。
- 配置和调优复杂:ParNew 收集器的配置和调优相对于 Serial 收集器更加复杂,需要合理设置并行线程数等参数以达到最佳性能。
- 停顿时间仍存在:尽管 ParNew 收集器减少了垃圾收集的停顿时间,但在进行垃圾收集时,仍然需要暂停所有工作线程(Stop-The-World),在大堆内存的情况下,这可能仍然导致明显的停顿。
- 在JDK 9+中被淘汰:随着G1收集器的引入和成为默认的垃圾收集器,ParNew 加 CMS 的组合在 JDK 9 及之后的版本中不再是主流选择,因为 G1 提供了更平衡的吞吐量和停顿时间,以及更简单的调优过程。
ParNew/Serial Old收集器运行示意图

Parallel Scavenge 收集器 (复制算法)
新生代并行收集器, 追求高吞吐量, 高效利用 CPU
-XX:MaxGCPauseMillis 配置最大垃圾收集停顿时间 -XX:GCTimeRatio 配置吞吐量大小
并行垃圾回收器在进行垃圾回收时, 同样会持有所有应用程序的线程, 并冻结所有应用程序线程,来进行垃圾回收工作
优点:
- 高吞吐量:Parallel Scavenge 收集器注重达到一个可控制的吞吐量(Throughput),它使用多个线程并行执行垃圾收集操作,可以充分利用多核CPU的计算能力,从而实现高吞吐量的垃圾收集。这使得它非常适合处理大规模数据和对处理能力要求较高的应用。
- 快速回收:该收集器主要关注减少垃圾收集时的停顿时间,通过将垃圾收集任务划分为多个阶段,并使用多个线程并行执行,可以更快地完成垃圾收集,并尽量减少应用程序的暂停时间。
- 可控制的吞吐量和最大停顿时间:Parallel Scavenge 收集器提供了一些参数来精确控制吞吐量和最大停顿时间的平衡。可以根据应用程序的性能需求来调整这些参数,以达到最佳的垃圾收集性能。
缺点:
- 高延迟:由于 Parallel Scavenge 收集器注重吞吐量而非低延迟,因此在追求高吞吐量的同时,可能会导致垃圾收集的停顿时间相对较长。这对于某些对实时性要求较高的应用程序可能不太适合。
- 内存占用:Parallel Scavenge 收集器为了追求高吞吐量,通常会使用较大的堆空间来存储对象,并且不会立即释放未使用的内存。这可能导致在某些情况下,垃圾收集器无法及时回收所有可回收的内存,从而造成一定的内存浪费。
Parallel Scavenge/Parallel Old收集器运行示意图

2.2 老年代的收集器
Serial Old 收集器 (标记-整理算法)
老年代单线程收集器,Serial 收集器的老年代版本,使用“标记-整理”(Mark-Compact)算法来进行垃圾收集。在标记阶段,它会遍历堆内存,标记出所有可达的对象;然后在整理阶段,将所有存活的对象向一端移动,从而清理出连续的空闲内存空间,减少内存碎片。
优点:
- 简单高效:对于单核处理器或者小内存资源的应用,Serial Old 收集器因为其简单和直接的垃圾回收方式,在这类环境下可以非常高效。
- 易于实现和调试:由于只涉及单线程操作,使得 Serial Old 收集器相对容易实现和调试。
缺点:
- 停顿时间长:所有应用线程都必须在垃圾收集期间暂停,这可能导致较长的停顿时间,影响到应用的响应速度和吞吐量。
- 不适合多核处理器:在多核处理器系统上,Serial Old 收集器无法充分利用硬件资源,因此并不适合大型、多线程的服务器端应用。
Serial/Serial Old收集器运行示意图

Parallel Old 收集器 (标记-整理算法)
老年代并行收集器, 吞吐量优先, Parallel Scavenge收集器的老年代版本
特点
- 多线程:Parallel Old 收集器同样采用多线程进行垃圾回收,这意味着它可以充分利用多核心处理器的优势,提高垃圾收集的效率。
- 算法:它使用“标记-整理”(Mark-Compact)算法来处理老年代的垃圾收集。与“标记-清除”(Mark-Sweep)算法相比,“标记-整理”算法在完成垃圾收集后不会留下空间碎片,从而避免了长时间运行后可能出现的内存分配问题。
- 适用场景:Parallel Old 收集器适用于多核服务器环境中,对吞吐量有较高要求的场景。它能够提供比CMS更好的吞吐量,但在停顿时间上可能不如CMS收集器和G1收集器
Parallel Scavenge/Parallel Old收集器运行示意图

CMS(Concurrent Mark Sweep)收集器(标记-清除算法)
收集器是一种以获取最短回收停顿时间为目标的垃圾收集器,主要用于收集老年代的垃圾。它适用于对响应时间有较高要求的场景,通过并发标记和清除来实现减少停顿时间的目的。
整个过程分为4个步骤,包括:
1.初始标记(CMS initial mark)
- 特点:这是一个需要“Stop-The-World”(STW)的阶段,但其持续的时间相对较短。
- 工作内容:标记所有直接与GC Roots相连的对象,以及从年轻代到老年代的引用对象(跨代引用)。此阶段虽然停顿时间短,但需要暂停所有应用线程。
2.并发标记(CMS concurrent mark)
- 特点:在这个阶段,GC线程和应用线程可以并发运行,不需要暂停应用线程。
- 工作内容:从初始标记阶段找到的根对象开始遍历整个对象图,标记所有可达的存活对象。由于在并发标记过程中应用线程仍在运行,可能会改变对象引用关系,因此需要记录这些改变。
3.重新标记(CMS remark)
- 特点:这也是一个需要STW的阶段,但CMS采用了多种技术(如增量更新、原始快照等)来缩短这一阶段的停顿时间。
- 工作内容:修正并发标记阶段因程序运行导致的标记记录变动。为了减少停顿时间,CMS在这个阶段使用了算法,如增量更新(Incremental Update)和原始快照(SATB,Snapshot At The Beginning),来处理并发阶段遗留的问题。
4.并发清除(CMS concurrent sweep)
- 特点:应用线程和垃圾收集线程可以并发执行,不需要暂停应用线程。
- 工作内容:清理掉在标记阶段标记为已死亡的对象,并回收他们占用的内存空间。这一阶段结束后,CMS收集器将已经清理好的内存空间归还给JVM使用。
但是CMS还远达不到完美的程度,它有以下3个明显的缺点:
- CMS收集器对CPU资源非常敏感。
- CMS收集器无法处理浮动垃圾(Floating Garbage),
- CMS收集结束时会有大量空间碎片产生。
Concurrent Mark Sweep收集器运行示意图

2.3 整个堆
G1(Garbage First)收集器 (标记-整理算法)
G1 回收的范围是整个 Java 堆(包括新生代,老年代)
G1具备如下特点。
- 并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿的时间,部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。
- 分代收集:与其他收集器一样,分代概念在G1中依然得以保留。虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果。
- 空间整合:与CMS的“标记—清理”算法不同,G1从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个Region之间)上来看是基于“复制”算法实现的,但无论如何,这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。这种特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。
- 可预测的停顿:这是G1相对于CMS的另一大优势,降低停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎已经是实时Java(RTSJ)的垃圾收集器的特征了。
G1收集器的运作大致可划分为以下几个步骤:
1.初始标记(Initial Marking)
- 特点:此阶段需要暂停所有的应用线程(Stop-The-World, STW),但持续时间相对较短。
- 工作内容:标记从GC Roots直接可达的对象,以及年轻代中存活对象的边界。
2.根区域扫描(Root Region Scanning)
- 特点:在应用线程运行的同时执行,不需要暂停应用线程。
- 工作内容:处理初始标记阶段找到的存活对象所引用的对象。这一步骤必须在年轻代的下一次垃圾收集前完成。
3.并发标记(Concurrent Marking)
- 特点:与应用线程并发执行,不会导致应用线程停顿。
- 工作内容:从根区域扫描阶段标记的对象开始,遍历整个堆,标记出所有可达的存活对象。
4.最终标记(Final Marking)
- 特点:需要STW,但通过优化(如使用记忆集和卡表来减少标记范围)尽量缩短停顿时间。
- 工作内容:处理并发标记阶段遗留的少量工作,如处理SATB(Snapshot At The Beginning)队列中的剩余对象,以及修正并发标记期间因应用程序运行产生的变动。
5.筛选回收(Live Data Counting and Evacuation)
- 特点:需要STW,此阶段的停顿时间是G1收集器控制的重点。
- 工作内容:根据之前的标记结果,选择一部分内存区域进行清理。G1会优先选择回收价值最大的区域(即垃圾最多的区域)进行清理,以提高垃圾收集的效率。在这个阶段,存活的对象会被移动到其他区域,同时整理碎片,释放空间。
G1收集器运行示意图

相关文章:
jvm垃圾收集器之七种武器
目录 1.回收算法 1.1 标记-清除算法(Mark-Sweep) 1.2 复制算法(Copying) 1.3 标记-整理算法(Mark-Compact) 2.HotSpot虚拟机的垃圾收集器 2.1 新生代的收集器 Serial 收集器(复制算法) ParNew 收集器 (复制算法) Parallel Scavenge 收集器 (复制…...
STM32面试相关问题
STM32面试相关问题: STM32的内核型号,主频,传感器和单片机总线类型,IIC,SPI,RS485UART数据帧项目中一些参数的设置 STM32 系统移植 ARM编译 常用的驱动编写方式 自己写过哪些方面驱动 其实如果问32的问题,…...
风行智能电视N39S、N40 强制刷机升级方法,附刷机升级数据MstarUpgrade.bin
升级步骤: 1、下载刷机数据,如是压缩包,需要先解压,然后将刷机bin格式的文件重命名为MstarUpgrade.bin 2、将此文件放到U盘根目录 (U盘格式FAT32,单分区,建议4G的优盘刷机成功率高)…...
【C语言】简易英语词典
文章目录 一、定义英语单词信息的结构体二、主函数功能逻辑三、查单词函数四、背单词函数五、补充 一、定义英语单词信息的结构体 添加必要的头文件、宏定义和声明,之后定义英语单词信息结构体。 /* 头文件和宏定义 */ #include <stdio.h> #include <std…...
【算法题】104. 二叉树的最大深度
题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root [1,nul…...
Docker配置Portainer容器管理界面
目录 一、Portainer 简介 优点: 缺点: 二、环境配置 1. 拉取镜像 2. 创建启动容器 三、操作测试 1. 进入容器 2. 拉取镜像并部署 3. 访问测试 一、Portainer 简介 Portainer 是一个开源的轻量级容器管理界面,用于管理 Docker 容器…...
Linux network namespace 访问外网以及多命名空间通信(经典容器组网 veth pair + bridge 模式认知)
写在前面 整理K8s网络相关笔记博文内容涉及 Linux network namespace 访问外网方案 Demo实际上也就是 经典容器组网 veth pair bridge 模式理解不足小伙伴帮忙指正 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已…...
网络渗透测试:Wireshark抓取qq图片
Wireshark Wireshark Downloadhttps://www.wireshark.org/download.html 简介 WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。本文主要内容包括: 1、Wireshar…...
网络协议与攻击模拟_16HTTP协议
1、HTTP协议结构 2、在Windows server去搭建web扫描器 3、分析HTTP协议流量 一、HTTP协议 1、概念 HTTP(超文本传输协议)用于在万维网服务器上传输超文本(HTML)到本地浏览器的传输协议 基于TCP/IP(HTML文件、图片、查询结构等&…...
叙事弧基础
原文:MasterClass. 2020. Learn About Narrative Arcs: Definition, Examples, and How to Create a Narrative Arc in Your Writing - 2021. https://www.masterclass.com/articles/what-are-the-elements-of-a-narrative-arc-and-how-do-you-create-one-in-writin…...
python从入门到精通(二十):python的exe程序打包制作
python的exe程序打包制作 python打包的概念python打包的模块导入模块安装验证基本语法命令参数文件夹模式单文件模式资源嵌入exe更改图标启动画面(闪屏)禁用异常提示 python打包的概念 将普通的*.py程序文件打包成exe文件。exe文件即可执行文件…...
three.js 细一万倍教程 从入门到精通(一)
目录 一、three.js开发环境搭建 1.1、使用parcel搭建开发环境 1.2、使用three.js渲染第一个场景和物体 1.3、轨道控制器查看物体 二、three.js辅助设置 2.1、添加坐标轴辅助器 2.2、设置物体移动 2.3、物体的缩放与旋转 缩放 旋转 2.4、应用requestAnimationFrame …...
电路设计(16)——纪念馆游客进出自动计数显示器proteus仿真
1.设计要求 设计、制作一个纪念馆游客进出自动计数显示器。 某县,有一个免费参观的“陶渊明故里纪念馆”,游客进出分道而行,如同地铁有确保单向通行的措施。在入口与出口处分别设有红外检测、声响、累加计数器装置,当游人进&#…...
Python数学建模之回归分析
1.基本概念及应用场景 回归分析是一种预测性的建模技术,数学建模中常用回归分析技术寻找存在相关关系的变量间的数学表达式,并进行统计推断。例如,司机的鲁莽驾驶与交通事故的数量之间的关系就可以用回归分析研究。回归分析根据变量的…...
单片机学习笔记---DS18B20温度传感器
目录 DS18B20介绍 模拟温度传感器的基本结构 数字温度传感器的应用 引脚及应用电路 DS18B20的原理图 DS18B20内部结构框图 暂存器内部 单总线介绍 单总线电路规范 单总线时序结构 初始化 发送一位 发送一个字节 接收一位 接收一个字节 DS18B20操作流程 指令介…...
【网络】WireShark过滤 | WireShark实现TCP三次握手和四次挥手
目录 一、开启WireShark的大门 1.1 WireShark简介 1.2 常用的Wireshark过滤方式 二、如何抓包搜索关键字 2.1 协议过滤 2.2 IP过滤 编辑 2.3 过滤端口 2.4 过滤MAC地址 2.5 过滤包长度 2.6 HTTP模式过滤 三、ARP协议分析 四、WireShark之ICMP协议 五、TCP三次握…...
开源免费的Linux服务器管理面板分享
开源免费的Linux服务器管理面板分享 一、1Panel1.1 1Panel 简介1.2 1Panel特点1.3 1Panel面板首页1.4 1Panel使用体验 二、webmin2.1 webmin简介2.2 webmin特点2.3 webmin首页2.4 webmin使用体验 三、Cockpit3.1 Cockpit简介3.2 Cockpit特点3.3 Cockpit首页3.4 Cockpit使用体验…...
leetcode算法-位运算
位运算,直接在二进制上进行的按位操作,位运算的种类如下: 1.按位异或^:异或的含义是操作的两位不同,则结果为1,相同则结果为0,所以两个相同的数异或,结果应该是0,3^3的结果是0,3^4的…...
「MySQL」约束
概述 分类 约束描述关键字非空约束限制该字段的数据不能为 nullNOT NULL唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY默认约束保存数据时,如果未指定该字段的值,则采…...
C语言:详解操作符(下)
上一篇链接:C语言:详解操作符(上)摘要: 在上篇文章中,我们已经讲过位操作符等涉及二进制的操作符,这些有助于帮助我们后期理解数据如何在计算机中运算并存储,接下来本篇将更多的讲述…...
基于python视频弹幕情感分析 视频可视化 短视频推荐系统 协同过滤推荐算法
1、项目介绍 技术栈: Python语言、Flask框架、 requests爬虫、协同过滤推荐算法、sqlite数据库、bilibili数据、前台后台 B站数据采集分析、推荐与可视化分析系统是一个强大的工具,它利用Python语言、Flask框架、requests爬虫技术、协同过滤推荐算法以及…...
OpenClaw效率对比:GLM-4.7-Flash与云端API实测数据
OpenClaw效率对比:GLM-4.7-Flash与云端API实测数据 1. 测试背景与动机 上周在优化个人自动化工作流时,我遇到了一个实际选择难题:应该用本地部署的GLM-4.7-Flash模型,还是继续使用云端API服务?这个问题看似简单&…...
YOLOv7剪枝实战:5种高效剪枝方法对比与代码实现
YOLOv7剪枝实战:5种高效剪枝方法对比与代码实现 在目标检测领域,YOLOv7以其卓越的速度-精度平衡成为工业界宠儿。但当我们将模型部署到边缘设备或需要高吞吐量的生产环境时,原始模型的计算量和参数量往往成为瓶颈。这时,模型剪枝技…...
2.4 微积分与自动微分1
微积分 导数与微分 操作之前记得检查版本确保 matplotlib 正确安装:在d2l环境下输入pip install matplotlib (windows版) 重启jupyter就可以运行了(如果还是不行自行移步ai) 1.我们通过简单的微分方式得到我们需要的极限 2.之后我们再试着…...
从零开始学习C++ -- 基础知识
C入门基础1.C的第一个程序2.命名空间2.1 namespace的价值2.2 namespace的定义2.3命名空间使用3.C输入&输出4.缺省参数5.函数重载6.引用6.1引用的概念和定义6.2引用的特性6.3引用的使用6.4const引用6.5指针和引用的关系7.inline8.nullptr1.C的第一个程序 #include <iost…...
4大场景解决散热难题:开源散热管理工具全攻略
4大场景解决散热难题:开源散热管理工具全攻略 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanCont…...
douyin-downloader:抖音视频批量下载解决方案
douyin-downloader:抖音视频批量下载解决方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代,视频资源的高效管理已成为内容创作者、教育工作者和社交媒体运营者…...
SEO_新手必看的SEO优化入门教程与核心方法(361 )
<h3 id"seoseo">SEO:新手必看的SEO优化入门教程与核心方法</h3> <p>在互联网时代,拥有一个成功的网站不仅仅是有好的设计和内容,还需要通过SEO(搜索引擎优化)来提升网站的可见性和流量。对于新手来说…...
从登录到鉴权:一个前后端分离项目的完整JWT非对称加密配置指南(Vue3 + Spring Boot)
从登录到鉴权:一个前后端分离项目的完整JWT非对称加密配置指南(Vue3 Spring Boot) 在现代Web应用开发中,前后端分离架构已成为主流选择。这种架构下,如何安全高效地处理用户认证与授权成为一个关键问题。本文将带你从…...
CH340系列芯片选型指南与外围电路设计实战
1. CH340系列芯片选型指南 第一次接触CH340系列芯片时,我被它丰富的型号搞得眼花缭乱。作为国内最常用的USB转串口芯片之一,CH340系列凭借稳定的性能和亲民的价格,在嵌入式开发领域占据重要地位。但面对十几种不同型号,新手往往会…...
