0

0

说一下jvm 有哪些垃圾回收器?

月夜之吻

月夜之吻

发布时间:2025-10-24 09:34:02

|

965人浏览过

|

来源于php中文网

原创

根据应用场景选择合适的jvm垃圾回收器可优化性能,serial适用于单核小应用,parallel提升吞吐量,cms降低延迟但有碎片问题,g1平衡延迟与吞吐量并减少碎片,zgc和shenandoah实现亚毫秒级停顿,适合大堆低延迟场景;需结合应用类型、堆大小、cpu核心数等选择,并通过监控工具调优,避免full gc频繁触发和内存泄漏。

说一下jvm 有哪些垃圾回收器?

JVM的垃圾回收器种类繁多,各有千秋,选择合适的垃圾回收器对应用的性能至关重要。简单来说,就是根据不同的应用场景和需求,选择不同的垃圾回收策略,尽可能地减少垃圾回收对应用的影响,提高吞吐量或者降低延迟。

解决方案

JVM的垃圾回收器主要分为以下几类,它们可以组合使用,以适应不同的应用场景:

  1. Serial Collector (串行收集器)

    • 它是最古老的垃圾回收器,也是单线程的。
    • 在垃圾回收时,会暂停所有应用线程(Stop-The-World,STW)。
    • 适用于单核CPU环境,或者数据量较小的应用。
    • 简单高效,但STW时间较长。
    • 使用场景:客户端应用或者数据量很小的服务器应用。
  2. Parallel Collector (并行收集器)

    • 使用多线程进行垃圾回收,可以缩短STW时间。
    • 同样会暂停所有应用线程。
    • 适用于多核CPU环境,对吞吐量有较高要求的应用。
    • 通过-XX:+UseParallelGC启用。
    • 关注点:吞吐量,希望在单位时间内处理更多的任务。
  3. Concurrent Mark Sweep (CMS) Collector (并发标记清除收集器)

    • 目标是减少STW时间,尽可能地与应用线程并发执行垃圾回收。
    • 采用“标记-清除”算法,会产生内存碎片。
    • 在并发阶段,应用线程仍然可以运行,但会占用一部分CPU资源。
    • 适用于对响应时间有较高要求的应用,例如Web应用。
    • 通过-XX:+UseConcMarkSweepGC启用。
    • 缺点:容易产生内存碎片,且在并发阶段会占用CPU资源,降低吞吐量。
  4. Garbage First (G1) Collector (G1收集器)

    • 是JDK 7引入的,JDK 9之后成为默认的垃圾回收器。
    • 目标是替代CMS收集器,提供更好的性能和可预测的STW时间。
    • 将堆内存划分为多个Region,优先回收垃圾最多的Region(Garbage First)。
    • 采用“标记-整理”算法,减少内存碎片。
    • 适用于大堆内存的应用,对响应时间和吞吐量都有较高要求的应用。
    • 通过-XX:+UseG1GC启用。
    • G1的优势在于可以控制STW的时间,例如通过-XX:MaxGCPauseMillis=200设置最大暂停时间为200毫秒。
  5. Z Garbage Collector (ZGC) (ZGC收集器)

    • 是JDK 11引入的,是低延迟垃圾回收器。
    • 目标是实现亚毫秒级的STW时间,适用于超大堆内存的应用。
    • 采用着色指针和读屏障技术,实现并发的标记、整理和重定位。
    • 适用于对延迟极其敏感的应用,例如金融交易系统。
    • 通过-XX:+UseZGC启用。
    • ZGC的STW时间非常短,几乎可以忽略不计,但会占用更多的CPU资源。
  6. Shenandoah Collector (Shenandoah收集器)

    • 也是一种低延迟垃圾回收器,与ZGC类似。
    • 在JDK 12中正式发布。
    • 通过-XX:+UseShenandoahGC启用。

如何选择合适的垃圾回收器?

选择垃圾回收器需要考虑以下几个因素:

关于Objective
关于Objective

本文档主要讲述的是关于Objective-C手动内存管理的规则;在ios开发中Objective-C 增加了一些新的东西,包括属性和垃圾回收。那么,我们在学习Objective-C之前,最好应该先了解,从前是什么样的,为什么Objective-C 要增加这些支持。有需要的朋友可以下载看看

下载
  • 应用类型:是CPU密集型还是IO密集型?对延迟敏感吗?
  • 堆内存大小:堆内存越大,越需要使用G1、ZGC或者Shenandoah。
  • CPU核心数:CPU核心数越多,越适合使用并行垃圾回收器。
  • 吞吐量要求:如果对吞吐量有较高要求,可以选择Parallel Collector。
  • 延迟要求:如果对延迟有较高要求,可以选择CMS、G1、ZGC或者Shenandoah。

如何监控和调优JVM垃圾回收?

监控和调优JVM垃圾回收是保证应用性能的关键。可以使用以下工具

  • jstat:JDK自带的命令行工具,可以查看JVM的各种统计信息,包括垃圾回收信息。
  • jconsole:JDK自带的图形化监控工具,可以查看JVM的内存使用情况、线程信息、垃圾回收信息等。
  • VisualVM:功能强大的图形化监控工具,可以查看JVM的各种信息,还可以进行性能分析和诊断。
  • GC日志:通过配置JVM参数,可以将垃圾回收信息输出到日志文件中,方便进行分析。例如,-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

通过监控工具和GC日志,可以了解垃圾回收的频率、STW时间、内存使用情况等,从而进行调优。调优的常见手段包括:

  • 调整堆内存大小:根据应用的实际情况,调整堆内存的大小。
  • 选择合适的垃圾回收器:根据应用的需求,选择合适的垃圾回收器。
  • 调整垃圾回收器的参数:例如,调整G1的MaxGCPauseMillis参数,控制最大暂停时间。
  • 优化代码:避免创建过多的临时对象,减少垃圾回收的压力。

Full GC和Minor GC有什么区别?

Full GC(Major GC)和Minor GC是两种不同类型的垃圾回收。

  • Minor GC:也叫Young GC,只回收新生代的垃圾。由于新生代的垃圾对象存活时间短,所以Minor GC非常频繁,速度也很快。
  • Full GC:回收整个堆(包括新生代和老年代)的垃圾。Full GC的频率较低,但STW时间较长。

当新生代Eden区满了的时候,会触发Minor GC。当老年代满了或者空间不足时,会触发Full GC。Full GC的触发条件比较复杂,包括:

  • 老年代空间不足。
  • System.gc()的调用(不建议)。
  • Minor GC之后进入老年代的对象大于老年代可用空间。
  • Metaspace空间不足。

频繁的Full GC会严重影响应用的性能,应该尽量避免。可以通过调整JVM参数,例如调整新生代和老年代的比例,来减少Full GC的频率。

如何避免内存泄漏?

内存泄漏是指程序中分配的内存无法被回收,导致内存占用不断增加,最终可能导致应用崩溃。避免内存泄漏需要注意以下几点:

  • 及时释放资源:例如,关闭文件流、数据库连接等。
  • 避免长时间持有对象:例如,将对象放入静态变量中,导致对象无法被回收。
  • 注意监听器和回调函数:确保在不需要的时候,及时移除监听器和回调函数。
  • 使用弱引用和软引用:对于一些不重要的对象,可以使用弱引用和软引用,让垃圾回收器在内存不足的时候回收这些对象。

可以使用内存分析工具,例如VisualVM,来检测内存泄漏。这些工具可以帮助你找到哪些对象占用了大量的内存,并且无法被回收。

为什么需要了解垃圾回收器?

了解垃圾回收器,就像了解汽车的引擎一样。虽然我们日常驾驶并不需要精通引擎的每一个细节,但了解引擎的工作原理,可以帮助我们更好地驾驶和维护汽车,避免一些不必要的故障。

同样,了解垃圾回收器可以帮助我们:

  • 更好地理解JVM的工作原理。
  • 选择合适的垃圾回收器,优化应用的性能。
  • 诊断和解决内存泄漏和性能问题。
  • 编写更高效的代码,减少垃圾回收的压力。

总而言之,了解垃圾回收器是Java开发者必备的技能之一。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

377

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

32

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

29

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

103

2026.02.06

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

494

2023.08.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

Golang云原生架构师课程
Golang云原生架构师课程

共49课时 | 3.3万人学习

Golang基础入门到精通(第二季)
Golang基础入门到精通(第二季)

共49课时 | 3.1万人学习

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

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