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

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的特性及适用场景,开发者可以根据应用需求(吞吐量、延迟、内存大小)选择最合适的垃圾回收器。

相关文章:

  • 保姆式 网站建设wordpress全教程----包含疑难杂症
  • PHP:赋能Web开发的经典语言与未来演进
  • MySQL 中 DISTINCT 和 GROUP BY 的区别与联系
  • Linux基础与Nginx配置实战:从入门到精通
  • ESP8266+STM32 AT驱动程序,心知天气API 记录时间: 2025年5月26日13:24:11
  • 【后端高阶面经:MongoDB篇】41、MongoDB 是怎么做到高可用的?
  • FastDFS集群部署与性能优化实战
  • vite常见面试问题
  • 多模态大语言模型arxiv论文略读(九十三)
  • Zephyr OS: periodic_adv_rsp代码架构和实现
  • Linux基本指令篇 —— clear指令
  • 2.1 一文掌握 TypeScript 操作符
  • 寒武纪显卡MLU编译安装mmcv1.7.0、mmdetection2.26.0并测试
  • 如何在 ONLYOFFICE 演示文稿中调整段落首行缩进
  • 如何通过AI辅助数据分析
  • 凯恩斯宏观经济学与马歇尔微观经济学的数学建模和形式化表征
  • Flutter Container组件、Text组件详解
  • 程序编码规范,软件设计规范
  • 从0到1搭建AI绘画模型:Stable Diffusion微调全流程避坑指南
  • 《软件工程》第 6 章 - 软件设计概论
  • 百度站长反馈中心/竞价排名
  • 建立一个网站的费用/腾讯广告
  • 做一个网站以及app多少钱/百度指数是搜索量吗
  • 晋城网络公司做网站的/营销公司取名字大全
  • 挂号网站建设/西安seo优化公司
  • 承德网站网站建设/英雄联盟韩国