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

垃圾回收算法详解

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


在 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://www.xdnf.cn/news/20342.html

相关文章:

  • 《sklearn机器学习——回归指标2》
  • Java内部类
  • 再读强化学习(动态规划)
  • 时隔4年麒麟重新登场!华为这8.8英寸新「手机」给我看麻了
  • 《Ceph集群数据同步异常的根因突破与恢复实践》
  • 深入剖析RocketMQ分布式消息架构:从入门到精通的技术全景解析
  • Ubuntu 文件权限管理
  • 【正则表达式】选择(Alternation)和分支 (Branching)在正则表达式中的使用
  • MySQL InnoDB 的锁机制
  • Chrome 插件开发入门:打造个性化浏览器扩展
  • 神经网络|(十八)概率论基础知识-伽马函数·下
  • Follow 幂如何刷屏?拆解淘宝闪购×杨幂的情绪共振品牌营销
  • Doris 消费kafka消息
  • 通过PXE的方式实现Ubuntu 24.04 自动安装
  • 版本管理系统与平台(权威资料核对、深入解析、行业选型与国产平台补充)
  • 50.4k Star!我用这个神器,在五分钟内搭建了一个私有 Git 服务器!
  • 小程序的project.private.config.json是无依赖文件,那可以删除吗?
  • Aspose.Words for .NET 25.7:支持自建大语言模型(LLM),实现更安全灵活的AI文档处理功能
  • 《LangChain从入门到精通》系统学习教材大纲
  • java基础学习(四):类 - 了解什么是类,类中都有什么?
  • 25年下载chromedriver.140
  • 项目必备流程图,类图,E-R图实例速通
  • 面试 TOP101 贪心专题题解汇总Java版(BM95 —— BM96)
  • 实力登榜!美创科技荣膺数说安全《2025中国网络安全企业100强》
  • IDEA中Transaction翻译插件无法使用,重新配置Transaction插件方法
  • 基于飞算JavaAI的在线图书借阅平台设计实现
  • Process Explorer 学习笔记(第三章 3.2.2):定制可显示的列与数据保存
  • Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十七天
  • Bug排查日记:从崩溃到修复的实战记录
  • Nginx +Tomcat架构的必要性与应用示例