当前位置: 首页 > ai >正文

JVM垃圾回收器详细介绍

Java虚拟机(JVM)的垃圾回收器(Garbage Collector, GC)负责自动管理堆内存,回收不再使用的对象以释放资源。不同的垃圾回收器在算法、性能和应用场景上各有特点。以下是主流垃圾回收器的详细介绍:


一、JVM分代与GC基础

JVM堆内存分为新生代(Young Generation)和老年代(Old Generation):

  • 新生代:存放新创建的对象,分为Eden区和两个Survivor区(S0/S1)。采用复制算法(存活对象复制到另一块内存)。
  • 老年代:存放长期存活的对象。采用标记-清除标记-整理算法。

GC类型:

  • Minor GC:清理新生代。
  • Major GC/Full GC:清理整个堆(包括老年代和新生代),通常停顿时间长。

二、常见垃圾回收器

1. Serial 收集器
  • 特点:单线程、Stop-The-World(STW),简单高效。
  • 适用场景:客户端应用(如桌面程序),内存小(百MB以内)。
  • 算法:新生代(复制算法),老年代(标记-整理)。
  • 参数-XX:+UseSerialGC
2. Parallel Scavenge(吞吐量优先)
  • 特点:多线程并行收集,关注高吞吐量(单位时间处理任务量)。
  • 适用场景:后台计算型应用(如批处理)。
  • 算法:新生代(复制算法),老年代(标记-整理)。
  • 参数-XX:+UseParallelGC(JDK8默认)
3. ParNew 收集器
  • 特点:Parallel Scavenge的多线程改进版,与CMS配合使用。
  • 适用场景:需低停顿的服务器应用。
  • 参数-XX:+UseParNewGC
4. CMS(Concurrent Mark Sweep)
  • 目标:最小化停顿时间,采用并发标记清除
  • 步骤
    1. 初始标记(STW)
    2. 并发标记
    3. 重新标记(STW)
    4. 并发清除
  • 缺点:内存碎片、并发阶段占用CPU资源。
  • 参数-XX:+UseConcMarkSweepGC
5. G1(Garbage-First)
  • 目标:平衡吞吐量和延迟,JDK9+默认GC。
  • 特点
    • 将堆划分为多个Region,优先回收垃圾最多的区域。
    • 预测停顿时间(软实时性)。
    • 同时处理新生代和老年代。
  • 步骤:类似CMS,但通过SATB(Snapshot-At-The-Beginning)算法处理并发标记。
  • 参数-XX:+UseG1GC
6. ZGC(Z Garbage Collector)
  • 目标:超低停顿(<10ms),支持TB级堆内存。
  • 特点
    • 并发标记、整理(无STW)。
    • 使用颜色指针读屏障实现内存映射。
  • 适用场景:大内存、低延迟应用(如云原生)。
  • 参数-XX:+UseZGC(JDK15+正式支持)
7. Shenandoah
  • 目标:与ZGC类似,低停顿且高效。
  • 特点
    • 并发复制对象,减少STW时间。
    • 通过Brooks指针和读/写屏障实现。
  • 参数-XX:+UseShenandoahGC

三、对比与选择

回收器并行/并发分代停顿时间吞吐量适用场景
Serial单线程客户端应用
Parallel并行后台计算
CMS并发Web服务
G1并发/并行可控通用服务端(JDK9+默认)
ZGC并发极低中高大内存、低延迟
Shenandoah并发极低中高类似ZGC,JDK12+正式支持

四、选择建议

  1. 吞吐量优先:Parallel Scavenge。
  2. 低延迟响应:CMS(小堆)、G1(中等堆)。
  3. 超大堆/极致低延迟:ZGC或Shenandoah。
  4. 默认选择:JDK8用Parallel,JDK9+用G1,最新版可尝试ZGC。

五、参数调优示例

  • 启用G1:-XX:+UseG1GC -XX:MaxGCPauseMillis=200
  • 启用ZGC:-XX:+UseZGC -Xmx16g

通过理解不同GC的特性及适用场景,开发者可以根据应用需求(吞吐量、延迟、内存大小)选择最合适的垃圾回收器。

http://www.xdnf.cn/news/9112.html

相关文章:

  • 注解的使用和自定义
  • Composer 常规操作说明与问题处理
  • 【部署】读取制度类txt文件导入dify的父子分段知识库
  • Kubernetes 1.33您需要了解的和升级新功能
  • 爬虫学习-Scrape Center spa6 超简单 JS 逆向
  • 二叉树遍历
  • 打破壁垒:国内软件业产品与技术割裂困局及工程师产品思维重塑
  • 无网络docker镜像迁移
  • OSC协议简介、工作原理、特点、数据的接收和发送
  • 5月26日day37打卡
  • 【大模型Pre-Training实战总结】实现Qwen3增量预训练,Lora训练与合并
  • 修改mysql 数据库密码记录
  • MySQL数据库零基础入门教程:从安装配置到数据查询全掌握
  • 2025年AIR SCI1区TOP,具有新变异策略和外部存档机制mLSHADE-SPACMA+数值优化与点云配准,深度解析+性能实测
  • 【2025】harbor仓库搭建
  • MAR:无需量化的掩码自回归图像生成模型
  • Windows Server 2016 下封禁端口规避高危漏洞的测试实践
  • 通过chrome插件自动生成博客评论,高效发外链
  • 15.2【基础项目】使用 TypeScript 实现密码显示与隐藏功能
  • wsl2 安装 nodejs
  • 人工智能与教育科技:2025年个性化学习的新模式
  • (C++17) 未捕获异常 uncaught_exceptions
  • Java基础 Day21
  • 从无符号长整型数中提取字节
  • 【Redis】Redis安装
  • 红外遥控器接收实验:CubeMX配置底层软件
  • 基于vue框架的动漫网站noww0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 【windwos】文本编辑器Notepad++ 替代品Notepad--
  • 汇川伺服软件设置提示使能冲突
  • 深入解读Qwen3技术报告(五):后训练对齐