0

0

解释Java中的垃圾回收器的分类和特点,如何选择合适的垃圾回收器?

看不見的法師

看不見的法師

发布时间:2025-07-11 17:39:02

|

891人浏览过

|

来源于php中文网

原创

解释java中的垃圾回收器的分类和特点,如何选择合适的垃圾回收器?

Java的垃圾回收器(Garbage Collector,简称GC)是JVM中自动管理内存的核心机制。它负责回收不再使用的对象所占用的内存空间,从而避免内存泄漏和手动释放内存带来的风险。不同的垃圾回收器适用于不同的应用场景,选择合适的GC对程序性能至关重要。

解释Java中的垃圾回收器的分类和特点,如何选择合适的垃圾回收器?

常见的垃圾回收器分类及特点

目前主流的JVM(如HotSpot)提供了多种垃圾回收器,主要分为以下几类:

1. Serial GC:单线程回收器

  • 适用场景:客户端模式或小型应用
  • 特点
    • 使用单个线程进行垃圾回收,简单高效
    • 在执行GC时会暂停所有用户线程(Stop-The-World)
    • 内存占用小,适合运行在单核CPU或内存较小的环境中
  • 使用参数-XX:+UseSerialGC

2. Parallel Scavenge GC:多线程吞吐优先回收器

  • 适用场景:注重吞吐量的后端服务
  • 特点
    • 多线程并行执行GC,提升效率
    • 主要关注“吞吐量”(应用程序运行时间 / 总时间)
    • 年轻代使用复制算法,老年代使用标记-整理算法
  • 使用参数-XX:+UseParallelGC

3. CMS(Concurrent Mark Sweep)GC:低延迟回收器

  • 适用场景:需要响应时间较短的应用,如Web服务器
  • 特点
    • 以低停顿为目标,适合交互式系统
    • 老年代GC过程分为多个阶段,部分阶段与用户线程并发执行
    • 存在“并发模式失败”和“内存碎片”问题
  • 使用参数-XX:+UseConcMarkSweepGC(注意:JDK9开始废弃,JDK14移除)

4. G1(Garbage First)GC:平衡吞吐与延迟的分区回收器

  • 适用场景:堆内存较大、希望兼顾吞吐和响应时间的系统
  • 特点
    • 将堆划分为多个大小相等的Region
    • 可预测的停顿时间模型,优先回收垃圾最多的区域
    • 支持并发执行,减少停顿时间
  • 使用参数-XX:+UseG1GC(JDK7+推荐使用)

5. ZGC 和 Shenandoah:新一代低延迟GC

  • 适用场景:超大堆内存(TB级)且要求极低延迟的系统
  • 特点
    • 几乎所有阶段都可以与用户线程并发执行
    • ZGC支持TB级堆,停顿时间通常小于10ms
    • Shenandoah也主打低延迟,适合高并发场景
  • 使用参数
    • ZGC:-XX:+UseZGC
    • Shenandoah:第三方JVM或特定版本支持

如何根据业务需求选择合适的GC?

选择GC的关键在于理解你的应用类型和性能目标。下面是一些实用建议:

宣小二
宣小二

宣小二:媒体发稿平台,自媒体发稿平台,短视频矩阵发布平台,基于AI驱动的企业自助式投放平台。

下载
解释Java中的垃圾回收器的分类和特点,如何选择合适的垃圾回收器?

关注点一:吞吐量 vs 响应时间

  • 如果你运行的是后台批处理任务,更看重整体吞吐量,可以选择 Parallel Scavenge GC
  • 如果是在线服务系统,例如Web应用、API服务,需要快速响应请求,建议选择 G1 GC 或 CMS(已过时)

关注点二:堆内存大小

  • 堆内存较小(比如几百MB以内),Serial GC 是轻量而高效的选择
  • 堆内存超过几十GB,考虑使用 G1 GC
  • 若堆达到TB级别,追求更低延迟,可以尝试 ZGC 或 Shenandoah

关注点三:GC停顿对业务的影响

  • 对停顿敏感的系统(如金融交易、实时计算),应避免长时间STW(Stop-The-World)
  • 这类场景下,G1、ZGC 和 Shenandoah 更合适

实际选型的一些建议

  • 默认选择 G1 GC:从 JDK9 开始,G1 成为默认GC,适应大多数通用场景
  • 不要盲目追求低延迟:ZGC 和 Shenandoah 虽然停顿短,但配置复杂,且可能牺牲一些吞吐能力
  • 测试验证最重要:不同GC在实际负载下的表现差异可能很大,建议通过压力测试观察GC日志,对比吞吐量、停顿时长等指标

总结一下

Java中的GC种类多样,各有侧重。选择合适的垃圾回收器,关键是看你的应用对吞吐、延迟、堆大小的具体要求。如果你不确定该用哪个,先用 G1 GC,然后根据实际运行情况调整。基本上就这些,不复杂但容易忽略细节的地方还是得靠实测来验证。

立即学习Java免费学习笔记(深入)”;

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

841

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

737

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

399

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号