引言

想象一下,Java 程序运行就像在一个巨大的图书馆里借书还书。这个图书馆(JVM 的内存堆区)为了高效运转,需要一个聪明的“图书管理员”来清理失效的书籍(垃圾对象)。这,就是垃圾回收器(GC)的使命!


一、什么是 GC?

GC(Garbage Collection)是 JVM 自动内存管理的重要组成部分,负责回收不再被引用的对象所占用的内存空间,防止内存泄露和内存溢出。

1.1 为什么需要 GC?

  • 自动内存管理,减轻开发者负担
  • 避免野指针、内存泄露等问题
  • 保证 Java 应用稳定高效运行

1.2 GC 面临的挑战

  • 如何在不打断业务的前提下进行垃圾回收?
  • 如何避免过多的 STW(Stop-The-World)?
  • 如何在高并发、大内存场景下依然稳定?

二、JVM 内存结构简析(理解 GC 的基础)

JVM 堆区被划分为以下几个区域:

  • 新生代(Young Generation):包括 Eden 和两个 Survivor 区
  • 老年代(Old Generation):存放长生命周期的对象
  • 元空间(Metaspace):替代原有的永久代,存放类的元数据

垃圾回收的重点主要在 新生代和老年代


三、GC 算法简述

Java GC 的核心算法主要有:

  • 复制算法(Copying):用于新生代
  • 标记-清除(Mark-Sweep):用于老年代
  • 标记-压缩(Mark-Compact):避免内存碎片
  • 分代收集理论:新生代频繁回收,老年代少回收

四、GC 发展史:从 Serial 到 ZGC

4.1 Serial GC(串行垃圾回收器)

  • 回收机制:新生代使用复制算法,老年代使用标记-压缩算法
  • 回收线程:单线程
  • 触发机制:内存耗尽或触发 Full GC 时
缺点
  • 每次 GC 都会 Stop-The-World,且只能使用单线程
示例
-XX:+UseSerialGC

📌 适用场景:嵌入式、小型应用、单核处理器


4.2 CMS GC(Concurrent Mark Sweep)

CMS 是第一个低延迟为目标的 GC,着眼于缩短老年代的 GC 停顿时间。

工作流程
初始标记(STW) → 并发标记 → 重新标记(STW) → 并发清除
特点
  • 多线程并发标记和清除,减少 STW
  • 使用 标记-清除 算法,导致内存碎片问题
示例参数
-XX:+UseConcMarkSweepGC
缺点
  • 并发失败风险:老年代空间不足时需退化为 Serial Old GC
  • 空间碎片影响分配性能

📌 适用场景:中大型系统,对响应时间敏感的 Web 应用


4.3 G1 GC(Garbage First)

G1 GC 是 JDK 9 之后的默认 GC,旨在取代 CMS。

原理
  • 将整个堆划分为多个大小一致的 Region(既可作为 Eden、Survivor、Old)
  • 基于 Region 的优先级回收策略:优先回收垃圾最多的 Region
  • 并发标记后,通过 Evacuation 将存活对象复制到新的 Region,实现压缩
回收流程
初始标记(STW) → 并发标记 → 最终标记(STW) → 筛选回收(STW)
特点
  • 支持大堆(数十 GB)
  • 可配置 Pause Time(停顿目标)
  • 减少 Full GC 的频率
示例参数
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200

📌 适用场景:中大型服务端应用,追求吞吐和响应时间平衡


4.4 ZGC(Z Garbage Collector)

ZGC 是一个为低延迟场景设计的 GC,目标是将所有 GC 停顿控制在 10ms 以内。

特点
  • 几乎全程并发执行,所有 GC 阶段都不长时间阻塞应用线程
  • 使用 染色指针(Colored Pointers) 来标识对象状态
  • 通过读屏障和写屏障实现引用更新的同步
技术亮点
  • 支持极大的堆内存(最高可达 TB 级)
  • 多阶段并发整理,移动对象时应用线程无需停止
示例参数
-XX:+UseZGC
-XX:+UnlockExperimentalVMOptions

📌 适用场景:金融、电商、游戏等低延迟业务


五、不同 GC 的对比总结

特性SerialCMSG1ZGC
停顿时间极低
并发回收
内存碎片
吞吐量
响应时间更好极佳
大内存支持一般极好
是否压缩整理

六、GC 日志分析建议

可以通过以下 JVM 参数输出 GC 日志:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log

常见指标:

  • GC time:单次回收的耗时
  • freed memory:回收掉的内存大小
  • pause time:STW 的具体时间

七、真实案例分析

场景:大数据系统使用 CMS 导致频繁 Full GC

问题: CMS 回收速度跟不上对象创建速度,频繁触发 Full GC,导致延迟剧增。

解决方案: 切换为 G1 GC,并设置合理的 MaxGCPauseMillis,显著降低了延迟峰值。


八、选择建议

应用场景推荐 GC
单线程、小型程序Serial
中等延迟要求CMS
大型服务端系统G1
超大堆、极低延迟ZGC / Shenandoah

九、总结与未来展望

JVM 垃圾回收技术不断进化,从最初的串行单线程到如今几乎无感知的并发收集器,反映了 Java 在现代应用场景下对性能、可伸缩性和稳定性的持续追求。

未来,ZGC 与 Shenandoah 的持续优化将成为主流趋势,也许某一天,GC 将真正做到“零成本”!


🔚 尾声

👍 点赞 + ⭐ 收藏,助你 GC 不迷路!
📬 评论聊聊你在使用 GC 中踩过的坑,或者你的调优秘籍~
📌 关注我,带你一起玩转 Java 性能调优!

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

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

相关文章

(9)python+playwright自动化测试-页面(page)

1.简介 通过前边的讲解和学习,细心认真地你可能发现在Playwright中,没有Element这个概念,只有Page的概念,Page不仅仅指的是某个页面,例如页面间的跳转等,还包含了所有元素、事件的概念,所以我们…

《自动控制原理 》- 第 1 章 自动控制的基本原理与方式

1-1 自动控制的基本原理与方式 自动控制是指在没有人直接参与的情况下,利用外加的设备或装置,使机器、设备或生产过程的某个工作状态或参数按照预定的规律运行。自动控制的核心原理是反馈控制,即通过将系统的输出量回送到输入端,与…

DL00715-基于YOLOv11的水面漂浮物目标检测含数据集

【论文必备】基于YOLOv11的水面漂浮物目标检测——让你的研究走在科技前沿! 在环境监测、海洋保护和水质管理领域,水面漂浮物的检测一直是一个亟待解决的难题。传统的人工巡检方式不仅耗时费力,还无法覆盖广泛的水域范围。如今,基…

权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记

目录 1 基础知识 1.1 运算放大器在DAC中的作用 1.2 常见的基于运算放大器的DAC电路 1.2.1 倒T形电阻网络DAC 1.2.2 权电阻网络DAC 1.2.3 开关电容DAC 1.3 运算放大器的选择 1.4 设计注意事项 2 仿真实验 2.1 权电阻网络DAC实现数字0对应电压输出 2.2 权电阻网络DAC实…

Redis主从集群

✅ 一、什么是 Redis 主从集群? Redis 主从(Master-Slave)集群是一种最基础的集群方式: 一台 Redis 作为主节点(Master),负责写操作; 一到多台 Redis 作为从节点(Slave&…

【水印论文阅读1】将水印规则的定义域从离散的符号空间转移到连续的语义空间

【水印论文阅读1】将水印规则的定义域从离散的符号空间转移到连续的语义空间 写在最前面**为什么“token序列空间”有根本缺陷?****为什么“语义向量空间”能破局?****1. 连续性(抗攻击的核心)****2. 高维复杂性(防破解…

Glide缓存机制

一、缓存层级与设计目标 双级缓存: 内存缓存:弱引用 LruCache 磁盘缓存:DiskLruCache 设计目标: 减少网络流量消耗 避免Bitmap频繁创建/销毁引发的GC 提升图片加载速度 二、内存缓存机制 1. 双缓存结构 缓存类型存储对象…

BaiduSitemap - Typecho站点地图生成与多搜索引擎推送插件

文章目录 🌐 BaiduSitemap - Typecho站点地图生成与多搜索引擎推送插件✨ 功能特点🧩 插件架构核心模块文件结构📦 安装方法方法一:手动安装方法二:Git克隆⚙️ 配置说明站点地图基本设置搜索引擎配置百度搜索引擎必应(Bing)搜索引擎谷歌(Google)搜索引擎🚀 使用…

androidx中<layout>根布局的意义及用法

在 Android 开发中,<layout> 根布局是 Android Jetpack Data Binding 库的核心组件,用于声明该 XML 布局文件将使用数据绑定功能。以下是详细说明: 📌 一、基本作用 1. 启用数据绑定 <layout> 标签标志着此布局文件支持数据绑定,编译器会为其生成对应的绑定类…

QTreeWidget 简单使用

效果图&#xff1a; 关键代码&#xff1a; void MainProj::_InitTree() { connect(m_pTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(TreeItemClicked(QTreeWidgetItem*, int))); m_pTreeWidget->header()->setHidden(1); /*QTreeWid…

手势-handpose的pipeline介绍

手势-handpose的pipeline包括&#xff1a; 1、手部检测算法&#xff1a;单帧检测出左右手的边界框。 2、手部跟踪算法&#xff1a;连续帧跟踪&#xff0c;锁定左右手跟踪目标&#xff0c;作为后续的手部ui操作。 3、手部关键点检测算法&#xff1a;基于单帧的检测框图像作为输…

计算机操作系统(十七)内存管理

计算机操作系统&#xff08;十七&#xff09;内存管理 前言一、内存的使用与程序重定位&#xff08;一&#xff09;内存是什么&#xff1f;&#xff08;二&#xff09;程序的重定位过程&#xff08;三&#xff09;总结&#xff1a;内存使用的核心问题 二、连续分区管理&#xf…

【编译原理】期末

单选题 (4分) 令文法G[E]为&#xff1a;E->ET | T T->T*F | F F-> (E) | i 句型 F*iT 的最左素短语是&#xff08; &#xff09; A.F B.i C.T D.F*i B 短语&#xff1a; F*iT、F*i、F、i 素短语&#xff1a; i 最左素短语&#xff1a; i 单选题 (4分) 若在…

一个简单测试Deepseek吞吐量的脚本,国内环境可跑

一个简单测试Deepseek吞吐量的脚本,这里用DeepSeek-R1-Distill-Qwen-32B ,支持单卡4090 24G可跑,具体看你的硬件情况做调整,理论支持所有的模型,看你需要,可以修改模型名称,重点是pip使用国内的源,模型下载用阿里的ModelScope,无障碍下载,使用. 最后可以生成一个txt与html报表.…

前端基础知识JavaScript系列 - 19(正则表达式)

一、是什么 正则表达式是一种用来匹配字符串的强有力的武器 它的设计思想是用一种描述性的语言定义一个规则&#xff0c;凡是符合规则的字符串&#xff0c;我们就认为它“匹配”了&#xff0c;否则&#xff0c;该字符串就是不合法的 在 JavaScript中&#xff0c;正则表达式也…

Java锁机制知识点

一、锁的基础概念 1.1 什么是锁 在并发编程中&#xff0c;锁是用于控制多个线程对共享资源进行访问的机制。锁可以保证在同一时刻最多只有一个线程访问共享资源&#xff0c;从而保证数据的一致性。 1.2 锁的分类 可重入锁 vs 不可重入锁&#xff1a;可重入锁允许同一个线程…

2025下半年软考软件设计师(中级)怎么高效备考,目标是稳过线!

25下半年软考开始进入备考阶段&#xff0c;现在咱们就抛开那些文绉绉的官话&#xff0c;用大白话来聊聊2025下半年软考软件设计师&#xff08;中级&#xff09;怎么高效备考&#xff0c;目标是稳过线&#xff01; 核心思想&#xff1a;抓大放小&#xff0c;真题为王&#xff0…

Jupyter常见操作(持续更新)

Jupyter常见操作&#xff08;持续更新&#xff09; 本文主要整理一些常见的或者比较简单的Jupyter操作&#xff0c;尽量保证一次性整理出来&#xff0c;方便需要但是忘记的情况下可以直接查&#xff0c;希望能当字典。 1.查看Jupyter内核 jupyter kernelspec list 2.使用指定…

连点成画面积计算算法

连点成画面积计算算法 问题分析与算法设计 1. 问题特征分析 闭合多边形(起点和终点相同)线段可能交叉形成复杂形状需要处理自交多边形可能有多个内部空洞点数较多(≥50个点),需要高效算法2. 解决方案选择 采用平面扫描算法结合多边形布尔运算来准确计算最外层边界包围的…

华为云Flexus+DeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发:多渠道融合应用案例

华为云FlexusDeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发&#xff1a;多渠道融合应用案例 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不…