当前位置: 首页 > 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.xdnf.cn/news/1108675.html

相关文章:

  • Agent 设计模式
  • 前后端分离项目的完整部署(Jenkins自动化部署)
  • 【从零开始编写数据库:基于Python语言实现数据库ToyDB的ACID特性】
  • 27.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(一)
  • Android下一个简单的定时器,每隔一秒输出一个数字
  • Syntax Error: TypeError: Cannot set properties of undefined (setting ‘parent‘)
  • vue3 canvas 选择器 Canvas 增加页面性能
  • Kimi K2万亿参数开源模型原理介绍
  • 【论文阅读】HCCF:Hypergraph Contrastive Collaborative Filtering
  • 缓存三剑客解决方案
  • 【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序
  • 利用docker部署前后端分离项目
  • 敏捷开发方法全景解析
  • SQL server之版本的初认知
  • C#枚举:从基础到高级的全方位解析
  • 《通信原理》学习笔记——第一章
  • 《Spring 中上下文传递的那些事儿》Part 11:上下文传递最佳实践总结与架构演进方向
  • 基于MCP的CI/CD流水线:自动化部署到云平台的实践
  • Vue Vue-route (5)
  • Adobe Illustrator关于图标创建的问题
  • 【跟我学运维】chkconfig jenkins on的含义
  • 初等行变换会改变矩阵的什么?不变改变矩阵的什么?求什么时需要初等行变换?求什么时不能初等行变换?
  • 回归(多项式回归)
  • 电网通俗解析术语2:一二次设备关联
  • 【PycharmPyqt designer桌面程序设计】
  • Effective Modern C++ 条款9:优先考虑别名声明而非typedef
  • Socket到底是什么(简单来说)
  • 【Elasticsearch】昂贵算法与廉价算法
  • 史上最全 MySQL 锁详解:从理论到实战,一篇搞定所有锁机制
  • 网络编程员工管理系统