文章目录

目录

1. Serial GC(串行收集器)

2. Parallel GC(并行收集器)

3. CMS(Concurrent Mark-Sweep,并发标记 - 清除)

4. G1(Garbage-First,垃圾优先)

5. ZGC(Z Garbage Collector)

6. Shenandoah( shen-uh-doh-uh )

特性对比表:

总结:


前言

在 JVM 中,垃圾收集器(GC)的设计目标差异显著,主要体现在吞吐量、延迟、内存支持规模、线程模型等核心特性上。以下是 JVM 中常见 GC 收集器的详细特性对比:

1. Serial GC(串行收集器)

核心目标:单线程环境下的简单高效,专注于低内存占用实现简洁性

分代策略:严格分代(新生代 + 老年代):

  • 新生代:采用复制算法(将内存分为 Eden 区和两个 Survivor 区,存活对象复制到 Survivor)。

  • 老年代:采用标记 - 整理算法(标记存活对象后,将其压缩到内存一端,避免碎片)。

线程模型:单线程执行 GC:GC 过程中只有一个线程工作,且会暂停所有应用线程(STW,Stop-The-World)。

STW 情况:STW 时间较长(随堆大小增加而增加),因为单线程处理所有回收工作。

内存管理:堆内存规模较小(通常 < 1GB),不适合大内存场景。

优点

  • 实现简单,代码量少,内存占用极低(几乎无额外 GC 线程开销)。

  • 无多线程同步成本,在单 CPU 环境下效率较高。

缺点

  • STW 时间长,无法利用多核 CPU 优势。

  • 不适合大型应用或高并发场景。

适用场景

  • 嵌入式设备、小型命令行工具(如简单脚本)。

  • 单 CPU 环境或内存受限的场景(如物联网设备)。

所有 JDK 版本均支持,JDK 9 后默认不启用,需通过-XX:+UseSerialGC开启。

2. Parallel GC(并行收集器)

核心目标:最大化吞吐量(单位时间内应用程序运行时间占比),适合计算密集型场景。

分代策略:严格分代(新生代 + 老年代):

  • 新生代:并行复制算法(多线程同时复制存活对象)。

  • 老年代:并行标记 - 整理算法(多线程同时标记和压缩)。

线程模型:多线程并行执行 GC:GC 线程数默认与 CPU 核心数相关(可通过-XX:ParallelGCThreads配置),GC 时仍会 STW,但效率高于 Serial GC。

STW 情况:STW 时间比 Serial GC 短(多线程并行加速),但仍随堆大小增加而显著增长。

内存管理:支持中等堆内存(通常 1GB~10GB),堆过大会导致 STW 时间过长。

优点

  • 吞吐量高(GC 耗时占比低),充分利用多核 CPU。

  • 适合对吞吐量敏感、可接受一定 STW 延迟的场景。

缺点

  • 无法控制 STW 时间(随堆增大而变长),不适合延迟敏感型应用。

适用场景

  • 科学计算、大数据分析(如 Hadoop 离线任务)。

  • 后台批处理任务(对响应时间要求低,注重计算效率)。

JDK 支持

  • JDK 1.4.2 引入,JDK 5~8 默认 GC(Server 模式),需通过-XX:+UseParallelGC-XX:+UseParallelOldGC开启。

3. CMS(Concurrent Mark-Sweep,并发标记 - 清除)

核心目标:最小化STW 延迟,适合对响应时间敏感的应用(如 Web 服务)。

分代策略:严格分代(新生代 + 老年代):

  • 新生代:采用Parallel Scavenge(并行复制,与 Parallel GC 一致)。

  • 老年代:采用并发标记 - 清除算法(不压缩内存,避免整理耗时)。

并发与并行结合

  • 初始标记、重新标记:STW(单线程 / 多线程快速执行)。

  • 并发标记、并发清除:与应用线程同时运行(多线程 GC)。

工作流程:

  1. 初始标记:STW,标记 GC Roots 直接引用的对象(耗时极短)。

  2. 并发标记:与应用线程并行,遍历标记所有可达对象(耗时最长,无 STW)。

  3. 重新标记:STW,修正并发标记期间因应用线程修改引用导致的标记偏差(耗时短)。

  4. 并发清除:与应用线程并行,清除未标记的垃圾对象(无 STW)。

STW 时间极短(仅初始标记和重新标记阶段,通常 < 10ms),但并发阶段会占用 CPU 资源。

内存管理

  • 老年代不压缩,会产生内存碎片(长期运行可能导致大对象无法分配内存,触发 Full GC)。

  • 堆内存不宜过大(通常 < 32GB,否则并发标记阶段耗时过长)。

优点:

  • 低延迟,适合 Web 服务、实时响应系统。

  • STW 时间短,对用户体验影响小。

缺点:

  • 并发阶段占用 CPU 资源,降低应用吞吐量(约 10%~20%)。

  • 内存碎片严重,需定期通过-XX:+UseCMSCompactAtFullCollection强制压缩。

  • 对大内存支持差,且实现复杂(易出现内存泄漏风险)。

适用场景

  • 互联网 Web 应用(如电商网站、API 服务)。

  • 对响应时间敏感(如延迟要求 < 100ms)的在线服务。

  • JDK 5 引入,JDK 9 标记为废弃,JDK 14 正式移除,需通过-XX:+UseConcMarkSweepGC开启(仅老年代使用 CMS)。

4. G1(Garbage-First,垃圾优先)

核心目标:平衡吞吐量与延迟,支持可预测的 STW 时间,适合中大型堆内存场景。

区域化分代(逻辑分代,物理不分隔):

  • 堆内存划分为 2048 个大小相等的独立区域(Region,1MB~32MB,可配置)。

  • 每个 Region 动态扮演 Eden、Survivor 或老年代角色(根据对象存活时间)。

回收算法:

  • 新生代:复制算法(多线程并行复制存活对象到新 Region)。

  • 老年代:混合回收(优先回收垃圾占比高的 Region,结合标记 - 复制避免碎片)。

并行 + 并发结合

  • 年轻代回收:多线程并行 STW(类似 Parallel GC)。

  • 混合回收(含老年代):初始标记(STW)→ 并发标记(与应用线程并行)→ 最终标记(STW)→ 筛选回收(多线程并行 STW,选择垃圾多的 Region 回收)。

STW 情况:通过-XX:MaxGCPauseMillis(默认 200ms)设置目标 STW 时间,G1 会动态调整回收 Region 数量以满足目标,实际 STW 时间通常可控制在 100ms 内。

内存管理

  • 支持中等至大型堆内存(1GB~ 数百 GB),Region 机制使回收更灵活。

  • 通过复制算法减少内存碎片(回收时将存活对象复制到新 Region)。

优点:

  • 兼顾吞吐量和延迟,适用场景广泛。

  • 可预测 STW 时间,适合企业级应用。

  • 内存碎片少,支持动态调整新生代 / 老年代比例。

缺点:

  • 小堆内存场景下效率不如 Serial/Parallel GC(Region 管理有额外开销)。

  • 并发标记阶段仍会占用部分 CPU 资源。

适用场景

  • 企业级服务(如 ERP 系统、电商中台)。

  • 堆内存 10GB~100GB 的中大型应用(需平衡吞吐量和延迟)。

JDK 支持

  • JDK 7 引入,JDK 9 起成为默认 GC,需通过-XX:+UseG1GC开启(默认启用)。

5. ZGC(Z Garbage Collector)

核心目标:超低延迟(<10ms)+ 超大堆内存支持(TB 级),适合内存密集型、低延迟要求的大型系统。

不分代(所有对象统一管理),但可通过-XX:ZGenerational启用分代模式(JDK 21+)。

回收算法:基于区域化内存(Region 大小动态调整:小 Region 2MB,中 Region 32MB,大 Region 大对象独占),采用三色标记法 + 读屏障

  • 标记阶段:并发遍历对象引用(无 STW)。

  • 重定位阶段:并发移动存活对象(通过读屏障保证对象访问正确性)。

全并发 + 并行:几乎所有阶段(标记、重定位)与应用线程并发执行,仅初始标记和最终标记有极短 STW(通常 < 1ms)。

STW 情况:STW 时间极短(<10ms,且与堆大小无关),主要来自初始标记和最终标记(各约 1ms)。

内存管理

  • 支持超大堆内存(从 MB 级到 TB 级,如 16TB 堆内存仍能保持低延迟)。

  • 无内存碎片(重定位阶段自动压缩对象)。

优点

  • 延迟极低,适合对响应时间敏感的大型系统。

  • 堆内存支持规模大,无需担心内存碎片。

  • 吞吐量损失小(并发阶段 CPU 占用低)。

缺点

  • 小堆内存场景下,额外开销(如读屏障)可能高于 G1。

  • 分代模式(JDK 21+)仍在优化中,成熟度略低于 G1。

适用场景

  • 大型分布式系统(如分布式数据库、缓存服务)。

  • 内存密集型应用(如大数据实时分析、AI 训练平台)。

JDK 支持

  • JDK 11 作为实验特性引入,JDK 15 成为正式特性,需通过-XX:+UseZGC开启。

6. Shenandoah( shen-uh-doh-uh )

核心目标:低延迟(<10ms)+ 并发整理,与堆大小无关的 STW 时间,适合金融、交易等强实时场景。

不分代(JDK 17 + 支持分代模式),堆内存划分为 Region(类似 G1)。

回收算法:

并发标记 - 并发整理:通过 “转发指针”(每个对象额外存储一个指向新地址的指针)和 “写屏障” 实现并发移动对象,无需 STW 整理。

线程模型:全并发:标记、整理阶段均与应用线程并发执行,仅初始标记和最终标记有极短 STW(<1ms)。

STW 情况:STW 时间仅与存活对象数量相关(与堆大小无关),通常 < 10ms,适合超大堆。

内存管理

  • 支持 TB 级堆内存,无内存碎片(并发整理阶段自动压缩)。

  • 对大对象友好(单独 Region 存储,避免频繁移动)。

优点

  • 延迟稳定(不受堆大小影响),适合金融交易等强实时场景。

  • 并发整理无碎片,内存利用率高。

缺点

  • 实现复杂,依赖 JVM 源码修改(早期仅 Red Hat OpenJDK 支持)。

  • 额外内存开销(转发指针占对象大小的 12.5%)。

适用场景

  • 金融交易系统(如高频交易、支付网关)。

  • 超大内存服务(如 PB 级数据处理节点)。

JDK 支持

  • JDK 12 作为实验特性引入,JDK 17 成为正式特性,需通过-XX:+UseShenandoahGC开启。

特性对比表:

收集器核心目标分代策略回收算法线程模型STW 时间堆内存支持适用场景
Serial GC低内存占用严格分代复制(新)+ 标记 - 整理(老)单线程 STW长(随堆增大)<1GB嵌入式、小型工具
Parallel GC高吞吐量严格分代并行复制 + 并行标记 - 整理多线程并行 STW中(比 Serial 短)1GB~10GB科学计算、批处理任务
CMS低延迟严格分代并发标记 - 清除(老)并发 + 并行(部分 STW)短(<10ms)<32GB传统 Web 服务(已淘汰)
G1平衡吞吐与延迟区域化分代复制 + 混合回收并行 + 并发可预测(<100ms)1GB~ 数百 GB企业级服务、中大型应用
ZGC超低延迟 + 大内存可选分代并发标记 + 重定位全并发 + 并行极短(<10ms)MB~TB 级大型分布式系统、内存密集型
Shenandoah低延迟 + 并发整理可选分代并发标记 + 并发整理全并发极短(<10ms)MB~TB 级金融交易、强实时超大内存应用

总结:

选择 JVM GC 收集器的核心依据是业务场景:

  • 小型应用 / 嵌入式:优先 Serial GC;
  • 吞吐量优先(批处理):Parallel GC;
  • 中大型应用(平衡吞吐与延迟):G1(默认选择);
  • 超低延迟 + 大内存:ZGC 或 Shenandoah(根据 JDK 版本和生态选择)。

实际使用中需结合堆大小、CPU 核心数、延迟要求进行压测调优,而非盲目选择 “高端” 收集器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95921.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95921.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95921.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式C语言之链表冒泡排序

链表冒泡排序一是可以交换指针域的值&#xff0c;二是可以交换指针typedef struct st_node{int score;struce st_node *next;}Node,*LinkList;LinkList createList(){Node *head (Node *)malloc(sizeof(Node));if(NULL head){printf("内存分配失败!"):return NULL;…

远场代码学习_FDTD_farfield

项目4.2 farfield3d - Script command在3D模拟中将给定的功率或场剖面监视器或直线数据集投射到远场。返回电场强度|E| 2。语法描述 out farfield3d("mname",f, na, nb, illumination, periodsa, periodsb, index, direction)&#xff1b; 将给定的功率或场分布监…

Adobe Illustrator(Ai) 2022安装教程与下载地址

Adobe Illustrator&#xff08;通常简称 AI&#xff09;是一款由 Adobe 公司开发的、基于矢量图形的专业设计软件。它与 Photoshop&#xff08;基于位图/像素&#xff09;和 InDesign&#xff08;专注于页面排版&#xff09;并称为数字创意领域的“三巨头”&#xff0c;是平面设…

小迪web自用笔记27

框架就是一些封装好的东西*上节课补&#xff1a;JS负责美化框架的&#xff08;发送HTTP请求前端&#xff0c;js相当于前端并且附加上一些连接后端的功能。&#xff09;&#xff0c;JAVA是后端。PHPthink&#xff08;用的最多的框架&#xff09;URL&#xff1a;原&#xff1a;ht…

创建阿里云ECS实例操作(免费试用版)

目录 1、进入阿里云ECS控制台 2、创建ECS实例 3、重置实例密码 4、远程登陆实例 5、查看ECS信息 6、安装apache服务 7、端口规则设置 8、访问测试 9、释放实例 1、进入阿里云ECS控制台 https://www.aliyun.com/ 2、创建ECS实例 3、重置实例密码 4、远程登陆实例 5、查…

JVM相关 4|JVM调优与常见参数(如 -Xms、-Xmx、-XX:+PrintGCDetails) 的必会知识点汇总

目录&#xff1a;&#x1f9e0; 一、JVM调优目标1. 调优核心目标2. 调优常见问题&#x1f9e9; 二、JVM调优核心参数详解1. 堆内存相关参数2. 垃圾回收器相关参数3. GC日志与性能监控4. 元空间&#xff08;Metaspace&#xff09;调优5. 栈内存调优6. 其他关键参数&#x1f4cc;…

HOT100--Day13--104. 二叉树的最大深度,226. 翻转二叉树,101. 对称二叉树

HOT100–Day13–104. 二叉树的最大深度&#xff0c;226. 翻转二叉树&#xff0c;101. 对称二叉树 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型&#xff1a;二叉树。 关键&#xff1a;要深刻理解《递归》 104. 二叉树的最大深度 方法&#xff1a;递归 思路&…

Maven 从 0 到 1:安装、配置与依赖管理一站式指南

Maven 从 0 到 1&#xff1a;安装、配置与依赖管理一站式指南Maven 从 0 到 1&#xff1a;安装、配置与依赖管理一站式指南一、Maven 是什么&#xff1f;二、核心概念&#xff1a;POM三、Maven 是如何工作的&#xff1f;—— 仓库机制四、安装Maven五、在 IntelliJ IDEA 里配置…

k8s,v1.30.4,安装使用docker

一.前置概念Docker 与 Kubernetes 共用同一个 containerd 进程 时&#xff0c;只要满足以下 3 个条件&#xff0c;就不会冲突&#xff1a;检查点要求原因cgroup-driverkubelet 与 containerd 必须同为 systemd二者不一致会导致 Pod 无法调度Unix socketkubelet 指向 /run/conta…

开源AI智能名片链动2+1模式S2B2C商城小程序服务提升复购率和转介绍率的研究

摘要&#xff1a;本文聚焦于开源AI智能名片链动21模式S2B2C商城小程序在提升客户复购率和转介绍率方面的作用。服务对于促进客户复购和转介绍的重要性不言而喻&#xff0c;维护老客户的成本远低于开发新客户&#xff0c;微商通过推出各项服务来赢得客户忠诚。本文深入探讨开源A…

[数据结构] ArrayList(顺序表)与LinkedList(链表)

目录 1.List 1.1 什么是List 1.2 常用的方法 1.3 List的使用 2. 线性表 3. ArrayList 类(顺序表) 3.1 顺序表定义 3.2 ArrayList链表的功能模拟实现 3.3 ArrayList简介 3.4 ArrayList的构造方法 3.5 ArrayList的遍历 3.5 ArrayList的具体使用实例 3.5.1 杨辉三角 …

Hive使用Tez引擎出现OOM的解决方法

环境是Hive以Tez作为引擎&#xff0c;然后使用客户端&#xff08;比如DataGrip&#xff09;连接Hive运行SQL查询&#xff0c;运行过程中报错信息如下&#xff1a;java.lang.OutOfMemoryError: Java heap space…连接工具以DataGrip为例&#xff0c;解决办法如下&#xff1a; --…

SQL面试题及详细答案150道(81-100) --- 子查询篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 81. 什么是子查询?子查…

笔记:ubuntu安装matlab

记录一下ubuntu安装matlab的过程 一、进入桌面 虽然系统是ubuntu server&#xff0c;但是安装matlab最好还是有桌面。这里使用todesk等工具&#xff0c;进入桌面进行远程安装。 二、创建matlab账号 由于学校已经提供了matlab的账号&#xff0c;只需要用自己的学生邮箱进行注册即…

CentOS 7 编译安装 OpenSSL 3.4.2

CentOS 7默认已经安装了OpenSSL&#xff0c;不过版本比较低 openssl version结果为&#xff1a;OpenSSL 1.0.2k-fips 26 Jan 2017 已经无法满足需求 OpenSSL 源码下载链接&#xff1a;https://www.openssl-library.org/source/ 下载源码包为&#xff1a;https://github.com…

python advance -----object-oriented

alt shift 上下键&#xff0c;行代码上下移动0

具身智能的工程落地:视频-控制闭环的实践路径

引言&#xff1a;从“能算会说”到“会看能做” 具身智能真正的门槛&#xff0c;不在于把模型做得更大&#xff0c;而在于把感知—决策—执行焊成一条低时延、稳态可控的闭环工程链路&#xff1a;从相机/麦克风采集&#xff0c;到编解码与传输&#xff0c;再到边/端推理、指令…

STM32 - Embedded IDE - GCC - 如何在工程中定义一段 NoInit RAM 内存

导言如上所示&#xff0c;Keil创建一段NoInit内存同样是通过图形界面来完成&#xff0c;IRAM2的起始地址0x2000000&#xff0c;大小8bytes。NoInit的意思是程序初始化时&#xff0c;不会将内存清0初始化。如上所示&#xff0c;在MEMORY段&#xff0c;将64K的RAM内存划一块8byte…

MyBatisX代码生成插件在IDEA中的安装配置、连接数据库表生成代码快速开发示例

场景 MyBatisX插件介绍 MybatisX是一款基于IDEA的快速开发插件&#xff0c;由MyBatis-Plus团队开发维护&#xff0c;为效率而生。 它的主要功能如下&#xff1a; 支持mapper.xml和Mapper接口之间方法的互相导航跳转&#xff1b; 内置代码生成器&#xff0c;通过使用GUI的形…

单词分析与助记之数据建表(以production为例)

单词分析与助记数据建表&#xff08;以production为例&#xff09;&#xff1a; id&#xff08;流水号&#xff09;&#xff1a;词形&#xff1a;production配图1-标题&#xff1a;略配图1-地址&#xff1a;略配图2-标题&#xff1a;略配图2-地址&#xff1a;略配图3-标题&…