JVM垃圾回收器深度底层原理分析与知识体系构建
一、垃圾回收的基本步骤
-
标记(Marking)
- 从GC Roots(如虚拟机栈、方法区静态变量、本地方法栈等)出发,遍历对象引用链,标记所有可达对象为存活对象,未被标记的则视为垃圾。
- 此阶段需暂停用户线程(Stop-The-World, STW),不同回收器优化策略不同,例如CMS和G1通过并发标记减少停顿。
-
清除(Sweeping)
- 根据标记结果清理垃圾对象,具体实现方式因算法而异:
- 标记-清除(Mark-Sweep) :直接回收未标记对象,但会产生内存碎片。
- 标记-整理(Mark-Compact) :移动存活对象以消除碎片,适合老年代。
- 复制(Copying) :将存活对象复制到另一块内存区域,适合新生代(如Survivor区)。
- 压缩(Compacting,可选)
- 部分回收器(如Serial Old)在清除后整理内存,提升连续空间利用率。
二、垃圾回收器的分类
根据工作模式、线程数、内存区间等维度,垃圾回收器可分为以下类型:
1. 按线程数划分
-
串行回收器(Serial GC)
- 特点:单线程执行垃圾回收,全程STW。
- 适用场景:客户端程序或小内存应用(如嵌入式系统)。
- 代表:Serial(新生代)、Serial Old(老年代)。
-
并行回收器(Parallel GC)
- 特点:多线程并行回收,提高吞吐量,但STW时间仍较长。
- 适用场景:注重吞吐量、多核CPU的服务器应用。
- 代表:ParNew(新生代)、Parallel Scavenge(新生代)、Parallel Old(老年代)。
-
并发回收器(Concurrent GC)
- 特点:用户线程与GC线程交替工作,减少STW时间。
- 适用场景:低延迟要求的应用(如实时系统)。
- 代表:CMS(Concurrent Mark Sweep)、G1(Garbage-First)、ZGC。
2. 按分代划分
-
新生代回收器
- 使用复制算法,如Serial、ParNew、Parallel Scavenge。
- 新生代分为Eden、Survivor区,对象存活时间短,回收频率高。
-
老年代回收器
- 使用标记-整理或标记-清除算法,如CMS、Serial Old、Parallel Old。
- 老年代对象存活时间长,回收频率低但耗时长。
三、主流垃圾回收器详解
1. Serial/Serial Old
- 特点:单线程、STW、简单高效,适合小堆内存。
- 缺点:暂停时间长,不适用于服务端。
2. ParNew
- 特点:Serial的多线程版本,与CMS配合使用。
- 缺点:在单核或低并发环境中可能不如Serial高效。
3. Parallel Scavenge/Parallel Old
- 特点:以吞吐量为优先目标,适合后台计算型应用。
- 参数:可通过
-XX:MaxGCPauseMillis
和-XX:GCTimeRatio
调整停顿时间和吞吐量。
4. CMS(Concurrent Mark Sweep)
- 特点:并发标记、低延迟,但会产生内存碎片。
- 阶段:初始标记(STW)→ 并发标记 → 重新标记(STW)→ 并发清除。
- 问题:JDK 14后已废弃,因碎片化和无法处理大堆。
5. G1(Garbage-First)
- 特点:
- 将堆划分为多个Region,优先回收垃圾最多的区域。
- 支持并发标记、混合回收(同时处理新生代和老年代),且通过压缩减少碎片。
- 适用场景:大堆内存(如几十GB)和低延迟要求(默认从JDK 9开始)。
6. ZGC
- 特点:
- 支持TB级堆内存,STW时间不超过10ms,基于指针染色和读屏障实现并发。
- 适用于高吞吐量、低延迟的云原生应用。
四、选择与调优建议
-
版本差异
- JDK 8默认:Parallel Scavenge + Parallel Old。
- JDK 9+默认:G1。
- JDK 11+可选:ZGC(实验性功能)。
-
调优参数示例
- 启用G1:
-XX:+UseG1GC
。 - 设置堆大小:
-Xms4g -Xmx4g
(固定堆避免动态调整)。 - 日志分析:
-Xlog:gc*
(JDK 9+)或-XX:+PrintGCDetails
(JDK 8)。
- 启用G1:
-
场景推荐
- 高吞吐量:Parallel Scavenge/Old。
- 低延迟:G1或ZGC。
- 小内存:Serial。
五、垃圾回收的本质与哲学矛盾
垃圾回收的核心矛盾在于时空效率的平衡:时间维度上要减少STW(Stop-The-World)停顿时间,空间维度上要高效利用内存且避免碎片。这一矛盾驱动了GC算法的迭代。
底层逻辑框架:
- 对象存活判定:通过可达性分析构建对象图(Object Graph),以GC Roots为起点进行DFS/BFS遍历(三色标记法的数学抽象)
- 内存拓扑管理:分代假设(弱代假说)将内存划分为不同区域,通过空间换时间策略优化回收效率
- 并发控制:写屏障(Write Barrier)技术解决并发标记阶段的"对象消失"问题,具体实现有增量更新(CMS)和原始快照(G1)两种流派
一、算法演化与硬件协同
1. 分代算法的物理本质
- 新生代:采用复制算法(Copying)本质是顺序写+批量删除,利用空间局部性原理提升缓存命中率
- 老年代:标记-整理(Mark-Compact)通过内存重映射解决碎片,但需要处理指针更新问题(G1的Remembered Set)
2. 并发回收的硬件级优化
现代GC(如ZGC)利用地址视图转换实现并发压缩,关键技术包括:
- 指针染色(Colored Pointer):在64位指针中嵌入元数据
- 内存多重映射(mmap):同一物理内存映射到多个虚拟地址空间
四、主流回收器架构对比
回收器 | 内存模型 | 并发策略 | 碎片处理 | 适用场景 |
---|---|---|---|---|
CMS | 传统分代 | 并发标记+并行清除 | 不处理(标记清除) | 老年代低延迟 |
G1 | Region分区 | 增量标记+并行复制 | 局部整理 | 大堆平衡型 |
ZGC | 无分代 | 全并发染色指针 | 无碎片 | 超大堆(TB级)低延迟 |
Shenandoah | Region分区 | 并发复制+读屏障 | 无碎片 | 中等堆高吞吐量 |
设计哲学差异:
- CMS:时间优先,通过并发降低停顿,容忍内存碎片
- G1:空间可预测,建立Region回收价值模型
- ZGC:硬件驱动,利用64位地址空间特性突破传统限制
五、关键扩展
1. 三色标记的工程实现
- 漏标问题的两种解决方案:
- 增量更新(CMS) :记录新增引用(类似数据库redo log)
- 原始快照(G1) :记录删除引用(类似MVCC快照)
// 写屏障伪代码示例(G1风格)
void oop_field_store(oop* field, oop new_value) {pre_write_barrier(field); // 记录旧值*field = new_value; post_write_barbarrier(field, new_value); // 记录新值
}
2. 停顿时间控制机制
- G1的预测模型:基于Markov链建立Region回收价值预测
- ZGC的Phase机制:将GC过程分解为10+个可中断的phase
3. 内存分配与GC联动
- TLAB(Thread Local Allocation Buffer) :每个线程独享的分配缓冲区,避免全局锁竞争
- Humongous Object:G1对超大对象的特殊处理(直接放入老年代Region)
五、总结
JVM垃圾回收器的演进体现了对性能、延迟和内存管理的持续优化。从早期的单线程Serial到并发的G1、ZGC,开发者需根据应用场景(如堆大小、延迟要求、JDK版本)选择合适的回收器,并通过参数调优实现最佳性能。
相关文章:

JVM垃圾回收器深度底层原理分析与知识体系构建
一、垃圾回收的基本步骤 标记(Marking) 从GC Roots(如虚拟机栈、方法区静态变量、本地方法栈等)出发,遍历对象引用链,标记所有可达对象为存活对象,未被标记的则视为垃圾。此阶段需暂停用户线程&…...

30.[前端开发-JavaScript基础]Day07-数组Array-高阶函数-日期Date-DOM
JavaScript的DOM操作 (一) 1 什么是DOM? 认识DOM和BOM 深入理解DOM 2 认识DOM Tree DOM Tree的理解 3 DOM的整体结构 DOM的学习顺序 DOM的继承关系图 document对象 4 节点、元素导航 节点(Node)之间的导航&…...
IP、网关、子网掩码、DNS 之间的关系详解
IP、网关、子网掩码、DNS 之间的关系详解 在计算机网络中,IP、网关、子网掩码和 DNS 是几个关键概念,它们协同工作,共同保障网络通信的顺畅。本文将详细探讨它们之间的关系。 一、IP 地址 IP 地址是网络中设备的唯一标识,如同现…...
【Day50 LeetCode】图论问题 Ⅷ
一、图论问题 Ⅷ 1、dijkstra算法 堆优化 采用堆来优化,适合节点多的稀疏图。代码如下: # include<iostream> # include<vector> # include<list> # include<queue> # include<climits>using namespace std;class myco…...
结构体介绍及内存大小分配问题
结构体 一.结构体的介绍1.1结构体的声明1.2匿名结构体1.3结构的自引用1.4使用 typedef 简化结构体类型名 二.结构体内存对齐2.1内存对齐规则2.2结构体内存对齐原因2.3修改默认对齐数 在 C 语言中,结构体(struct)是一种用户自定义的数据类型&a…...

halcon 条形码、二维码识别、opencv识别
一、条形码 函数介绍 create_bar_code_model * 1.创建条码读取器的模板 * 参数一:通用参数的名称,针对条形码模型进行调整。默认值为空 * 参数二:针对条形码模型进行调整 * 参数三:条形码模型的句柄。 create_bar_code_model (…...

Vue框架的使用 搭建打包 Vue的安全问题(Xss,源码泄露)
前言 什么是Vue? Vue是轻量级的js框架 可以帮助我们一键构造网站,打包app程序等 Vue的基本使用 1、构造框架并启用 新建一个 目录 使用终端切换到当前的目录 创建vue项目 第一个弹出使用语法我们选择是 剩下的全选择否 发现创建好了 接着进行…...

Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下,5G 通信技术的普及、云计算能力…...

day2 - SpringBoot框架开发技术
主要内容 1. SpringBoot简介 2. 构建springboot工程 3. springboot接口返回json 4. springboot热部署 5. springboot资源属性配置 6. springboot整合模板引擎 7. springboot异常处理 8. springboot整合MyBatis 9. springboot整合redis 10. springboot整合定时任务 11. springbo…...

Flash-03
1-问题:Flash软件画两个图形,若有部分重合则变为一个整体 解决方法1:两个图形分属于不同的图层 解决方法2:将每个图形都转化为【元件】 问题2:元件是什么? 在 Adobe Flash(现在称为 Adobe Anim…...

新建菜单项的创建之CmpGetValueListFromCache函数分析
第一部分: PCELL_DATA CmpGetValueListFromCache( IN PHHIVE Hive, IN PCACHED_CHILD_LIST ChildList, OUT BOOLEAN *IndexCached, OUT PHCELL_INDEX ValueListToRelease ) 0: kd> dv KeyControlBlock 0xe1…...

【Word2Vec】Skip-gram 的直观理解(深入浅出)
01 什么是skip-gram 一句话来说就是,给定中心词,然后预测其周围的词: 02 模型结构 对于skip-gram来说,输入是一个[1 x V]维的ont-hot向量,其中V为词表大小,值为1的那一项就表示我们的中心词。经过一个[V x…...

在MacOS上打造本地部署的大模型知识库(一)
一、在MacOS上安装Ollama docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main 最后停掉Docker的ollama,就能在webui中加载llama模…...

(21)从strerror到strtok:解码C语言字符函数的“生存指南2”
❤个人主页:折枝寄北的博客 ❤专栏位置:简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…...

DeepSeek推出DeepEP:首个开源EP通信库,让MoE模型训练与推理起飞!
今天,DeepSeek 在继 FlashMLA 之后,推出了第二个 OpenSourceWeek 开源项目——DeepEP。 作为首个专为MoE(Mixture-of-Experts)训练与推理设计的开源 EP 通信库,DeepEP 在EP(Expert Parallelism)…...

1.2 Kaggle大白话:Eedi竞赛Transformer框架解决方案02-GPT_4o生成训练集缺失数据
目录 0. 本栏目竞赛汇总表1. 本文主旨2. AI工程架构3. 数据预处理模块3.1 配置数据路径和处理参数3.2 配置API参数3.3 配置输出路径 4. AI并行处理模块4.1 定义LLM客户端类4.2 定义数据处理函数4.3 定义JSON保存函数4.4 定义数据分片函数4.5 定义分片处理函数4.5 定义文件名排序…...

数据结构-顺序表专题
大家好!这里是摆子,今天给大家带来的是C语言数据结构开端-顺序表专题,主要介绍了数据结构和动态顺序表的实现,快来看看吧!记得一键三连哦! 1.数据结构的概念 1.1什么是数据结构? 数据结构是计…...
docker和containerd从TLS harbor拉取镜像
私有镜像仓库配置了自签名证书,https访问,好处是不需要处理免费证书和付费证书带来的证书文件变更,证书文件变更后需要重启服务,自签名证书需要将一套客户端证书存放在/etc/docker/cert.d目录下,或者/etc/containerd/c…...

kafka-关于ISR-概述
一. 什么是ISR ? Kafka 中通常每个分区都有多个副本,其中一个副本被选举为 Leader,其他副本为 Follower。ISR 是指与 Leader 副本保持同步的 Follower 副本集合。ISR 机制的核心是确保数据在多个副本之间的一致性和可靠性,同时在 …...

el-input实现金额输入
需求:想要实现一个输入金额的el-input,限制只能输入数字和一个小数点。失焦数字转千分位,聚焦转为数字,超过最大值,红字提示 效果图 失焦 聚焦 报错效果 // 组件limitDialog <template><el-dialog:visible.s…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...