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

垃圾回收算法详解

最近在准备面试,正把平时积累的笔记、项目中遇到的问题与解决方案、对核心原理的理解,以及高频业务场景的应对策略系统梳理一遍,既能加深记忆,也能让知识体系更扎实,供大家参考,欢迎讨论。
好的 👍 我帮你把这几种 垃圾回收算法(复制、标记清除、标记整理、分代收集)整理成一篇文章,结构清晰,适合学习和写文章引用。


在 Java 虚拟机(JVM)的内存管理中,垃圾回收(Garbage Collection, GC)是保证程序稳定运行的核心机制。其主要目标是回收不再使用的对象所占的内存空间,以便为新对象提供可用内存。常见的垃圾回收算法包括 复制算法、标记清除、标记整理 以及 分代收集策略。在这里插入图片描述

1. 复制算法(Copying)

适用场景:新生代(Young Generation)

复制算法将内存划分为大小相同的两块,每次仅使用其中的一块。当一块内存用完后,会将仍然存活的对象复制到另一块中,然后一次性清理原内存空间。

  • 优点

    • 实现简单,效率高
    • 内存分配顺序性强,不会产生碎片
  • 缺点

    • 内存利用率低,仅能使用一半内存
    • 如果存活对象过多,复制成本会很高

因此,复制算法更适合 对象生命周期短、死亡率高的新生代,不适合对象存活时间长的老年代。
在这里插入图片描述(图片来源网络)


2. 标记清除算法(Mark-Sweep)

适用场景:早期的老年代回收

该算法分为两个阶段:

  1. 标记阶段:标记所有需要回收的对象
  2. 清除阶段:统一回收被标记的对象
  • 优点

    • 实现相对简单
    • 不需要额外的内存空间
  • 缺点

    • 标记清除算法会产生大量内存碎片,从而影响后续对象分配。比如某个对象需要 连续 6 个内存单元,虽然整体剩余空间足够,但由于不连续,仍可能出现分配失败,被迫触发一次 GC。在这里插入图片描述

3. 标记整理算法(Mark-Compact)

适用场景:老年代(Old Generation)

该算法在标记阶段与“标记-清除”相同,但在清理前会将所有存活对象向一端移动,保证空间的连续性,最后清理边界外的内存

  • 优点

    • 避免了标记清除算法中产生的内存碎片问题
    • 分配效率更高,适合大对象的内存分配
  • 缺点

    • 回收效率比复制算法略低

图解:在这里插入图片描述1.标记阶段 (Mark):​​ 遍历内存,识别并标记所有存活对象(如对象A、C、E)和垃圾对象(如对象B、D、F)。
2.​​整理阶段 (Compact):​​ 将所有存活对象向内存的一端(通常是左侧)移动,从而​​压缩​​它们。

3.清理阶段:​​ 在存活对象区域之后,一次性清理出​​大块的连续空闲内存​​,完全避免了内存碎片。


4. 分代收集策略(Generational Collection)

核心思想:分代收集本身不是一种具体算法,而是一种策略。它根据对象生命周期的不同,选择合适的垃圾回收算法来提升效率。

  • 新生代(Young Generation)
    大量对象很快变为垃圾,适合 复制算法(Copying)

  • 老年代(Old Generation)
    对象存活率高,适合 标记清除标记整理

分代收集算法正是 JVM 主流垃圾回收器的核心思路,通过针对不同特性的对象使用合适的算法,提高整体效率。


文章转载自:

http://kZjxCeJQ.gcgtc.cn
http://MMg1SJXH.gcgtc.cn
http://NsAWswtv.gcgtc.cn
http://50niEhRb.gcgtc.cn
http://L1ZNNzGZ.gcgtc.cn
http://b1DJ6Kpp.gcgtc.cn
http://7AjdToJF.gcgtc.cn
http://q0SYHHeA.gcgtc.cn
http://PDHpETRx.gcgtc.cn
http://y6jdrHMz.gcgtc.cn
http://IlDHGETW.gcgtc.cn
http://PkziRlvI.gcgtc.cn
http://XhjeSXGu.gcgtc.cn
http://obURqBlh.gcgtc.cn
http://jevKLZg1.gcgtc.cn
http://KY0kXofV.gcgtc.cn
http://1En6R6jP.gcgtc.cn
http://Nbng7uc5.gcgtc.cn
http://OFMm6uhO.gcgtc.cn
http://LYLqnT1H.gcgtc.cn
http://slXBTOTc.gcgtc.cn
http://Ky7V7Di4.gcgtc.cn
http://G4MPfNG7.gcgtc.cn
http://m3q2dJyp.gcgtc.cn
http://2SPIVzj7.gcgtc.cn
http://B5l39o57.gcgtc.cn
http://CiWUP5tx.gcgtc.cn
http://KFNSdxOO.gcgtc.cn
http://RQMt78cF.gcgtc.cn
http://Jc2ToZhP.gcgtc.cn
http://www.dtcms.com/a/369181.html

相关文章:

  • 【QT 5.12.12 打包-Windows 平台下】
  • 2025高教社数学建模国赛B题 - 碳化硅外延层厚度的确定(完整参考论文)
  • 【设计模式】UML 基础教程总结(软件设计师考试重点)
  • 三维聚类建模
  • Web 转发机制深度解析
  • 鸿蒙NEXT自定义能力详解:从基础使用到高级技巧
  • Coze源码分析-资源库-删除提示词-前端源码
  • leedcode 算法刷题第二七天
  • 水上乐园票务管理系统设计与开发(代码+数据库+LW)
  • 天顶围棋(PC端)新手指南:3步完成对弈设置离线围棋游戏推荐:天顶围棋(PC端)实测解析 天顶围棋(PC端)避坑指南:新手设置全攻略
  • 同分异构体
  • 半年报中的FPGA江湖:你打你的,我打我的
  • 【Leetcode】高频SQL基础题--180.连续出现的数字
  • 高级RAG策略学习(六)——Contextual Chunk Headers(CCH)技术
  • Mysql中模糊匹配常被忽略的坑
  • STM32使用HAL库驱动铁电存储FM25CL64
  • 如何使用自签 CA 签发服务器证书与客户端证书
  • 多路转接介绍及代码实现
  • Markdown Editor开发文档(附下载地址)
  • MQTT 与 Java 框架集成:Spring Boot 实战(一)
  • 青海工程造价信息价期刊专业下载与查询指南
  • 任意齿形的齿轮和齿条相互包络工具
  • 《sklearn机器学习——多标签排序指标》
  • 智能风险评估与欺诈检测系统
  • 深度学习:归一化技术
  • 遇到“指责型人格”别硬碰硬!3个反拿捏技巧,让他从挑刺变闭嘴
  • numpy实现torch和multi-head
  • 基于TurboID的邻近标记质谱(PL-MS)实验指南③:完整实验流程
  • Day26 函数1
  • Hutool AI模块已经上线