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

12. JVM的垃圾回收器

1. JVM有哪些垃圾回收器

  • 串行垃圾收集器
  • 并行垃圾收集器
  • CMS(并发)垃圾收集器
  • G1垃圾收集器

1. 串行垃圾回收器(Serial GC)

Serial和Serial Old串行垃圾收集器,是指使用单线程进行垃圾回收,堆内存较小,适合个人电脑
Serial 作用于新生代,采用复制算法
Serial Old 作用于老年代,采用标记-整理算法

  • 算法:新生代(Copying),老年代(Mark-Sweep-Compact

  • 特点

    • 单线程执行,适用于单核 CPU 环境

    • 垃圾回收时会 STW(Stop-The-World),暂停所有应用线程

    • 适用于 客户端应用 或 小型应用

垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停(STW),等待垃圾回收的完成。


2. 并行垃圾回收器(Parallel GC / Throughput GC)

Parallel New和Parallel Old是一个并行垃圾回收器,JDK8默认使用此垃圾回收器
Parallel New作用于新生代,采用复制算法
Parallel Old作用于老年代,采用标记-整理算法

  • 算法:新生代(Copying),老年代(Mark-Sweep-Compact

  • 特点

    • 多线程并行 执行垃圾回收,提高吞吐量

    • 适用于 多核 CPU 环境

    • 默认 GC 在 Java 8 及之前版本

    • 适用于 后台计算型应用(如批处理任务)

垃圾回收时,多个线程在工作,并且java应用中的所有线程都要暂停(STW),
等待垃圾回收的完成


3. 并行老年代垃圾回收器(Parallel Old GC)

  • 算法:老年代采用 Mark-Sweep-Compact(并行优化版)

  • 特点

    • 与 Parallel GC 搭配使用,优化老年代回收

    • 相比 Parallel GC,老年代回收效率更高


4. CMS 垃圾回收器(Concurrent Mark-Sweep GC)

CMS全称 Concurrent Mark sweep,是一款并发的、使用标记-清除算法的垃圾回收器,该回收器是针对老年代垃圾回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验就好。其最大特点是在进行垃圾回收时,应用仍然能正常运行。

  • 算法:老年代采用 并发标记-清除(CMS)

  • 特点

    • 并发执行,减少 STW 时间,适用于 低延迟 应用

    • 不压缩内存,可能导致 内存碎片

    • 在 Java 14 后被移除


5. G1 垃圾回收器(Garbage-First GC)

  • 算法分 Region 收集(标记-整理 + 复制)

  • 特点

    • Java 9 及以后版本的默认 GC

    • 适用于 大堆内存(4GB+) 和 低延迟 场景

    • 可预测停顿时间(通过设定 -XX:MaxGCPauseMillis

    • 将堆划分为多个 Region,优先回收垃圾最多的 Region


垃圾回收器对比

GC 名称适用场景算法并行/并发低延迟大堆支持
Serial GC单核、客户端复制 + 标记-整理单线程
Parallel GC高吞吐量复制 + 标记-整理多线程
CMS GC低延迟(已废弃)并发标记-清除并发
G1 GC平衡吞吐和延迟分 Region 收集并发✅(4GB+)

JDK 版本默认 GC适用场景特点
JDK 8Parallel GC高吞吐量计算任务多线程并行,STW 较长
JDK 17G1 GC平衡吞吐与延迟分 Region 回收,低停顿

2. 问题总结 

2.1 说一下 JVM 的垃圾回收器?

在jvm中,实现了多种垃圾收集器,包括:

  • 串行垃圾收集器:Serial GC、Serial Old GC
  • 并行垃圾收集器:ParallelOld GC、ParNewGC
  • CMS(并发)垃圾收集器:CMS GC,作用在老年代
  • G1垃圾收集器,作用在新生代和老年代

上一篇   下一篇

http://www.lryc.cn/news/585934.html

相关文章:

  • 1. 好的设计原则
  • Java应用全链路故障排查实战指南:从系统资源到JVM深度诊断
  • 钉钉小程序开发环境配置与前端开发指南
  • 【小沐杂货铺】基于Three.JS绘制汽车展示Car(WebGL、vue、react、autoshow、提供全部源代码)
  • 关于 验证码系统 详解
  • Ubuntu安装Jenkins
  • Java文件传输要点
  • 大数据在UI前端的应用深化研究:用户行为数据的时序模式挖掘
  • 前端内容-ES6
  • Java使用Langchai4j接入AI大模型的简单使用(一)
  • 【Linux网络】IP 协议详解:结构、地址与交付机制全面解析
  • 【PTA数据结构 | C语言版】阶乘的递归实现
  • 多线程进阶——JUC的常见类
  • w460实习生管理系统
  • 接口测试及常用接口测试工具总结
  • Springboot aop面向对象编程
  • JavaScript加强篇——第六章 定时器(延时函数)与JS执行机制
  • 【电脑】硬盘驱动器(HDD)的基础知识
  • TCP详解——各标志位
  • QML与C++相互调用函数并获得返回值
  • 浅谈 Pydantic v2 的 RootModel 与联合类型——构建多请求结构的统一入口模型
  • Linux中的git命令
  • Kimi K2万亿参数开源模型原理介绍
  • 猿人学js逆向比赛第一届第二十题
  • Linux进程的生命周期:状态定义、转换与特殊场景
  • 杭州乐湾科技有限公司的背景、产品体系与技术能力的全方位深度分析
  • linux_线程概念
  • 车载操作系统 --- Linux实时化与硬实时RTOS综述
  • windows电脑远程win系统服务器上的wsl2
  • 部署Harbor私有仓库