阿里二面:新生代垃圾回收为啥使用标记复制算法?

文章内容收录到个人网站,方便阅读hardyfish.top/

新生代垃圾回收采用标记-复制(Mark-Copy)算法的原因,主要是因为它非常适合新生代的内存特点。

新生代特点:

对象生命周期短暂:大部分新生代对象(80%~90%)会很快变成垃圾,存活率低。

回收频率高:新生代内存回收频繁,效率要求高。

标记-复制算法原理:

将内存空间划分为两部分(通常是大小相同的两个区,如Survivor区),每次回收时:

  • 标记存活对象。

  • 将存活对象直接复制到另一块空闲内存区域。

  • 原来的内存空间整体清空。

为什么新生代要用标记-复制?

回收效率高,速度快:

  • 新生代大部分对象存活率低,复制存活对象成本低。
  • 直接将存活对象复制走,剩余垃圾对象统一丢弃,不需要逐一回收,效率极高。

不产生内存碎片:

  • 标记-复制后的存活对象全部集中存放,内存布局紧凑。
  • 避免了老年代常见的内存碎片问题。

空间换时间的策略适合新生代:

  • 新生代较小,复制成本低,即使浪费一部分内存空间,也能显著提升GC效率。

与标记-清除或标记-整理对比:

算法 速度 内存碎片 空间开销 适合场景
标记-复制 无碎片 高(浪费一半空间) 存活率低、新生代
标记-清除 易产生碎片 存活率高、老年代
标记-整理 较慢 无碎片 存活率高、老年代
  • 新生代垃圾多,适合牺牲空间换取极高效率。
  • 老年代垃圾少,使用标记-清除或标记-整理避免空间浪费。

总结:

新生代之所以用标记-复制算法,根本原因是新生代对象死亡率极高

标记-复制算法能以空间换时间的方式快速、高效地回收垃圾,同时避免碎片,满足新生代高频、快速的回收需求。

相关推荐
蓝斯4977 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常7 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥8 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-8 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
前端工作日常8 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅8 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
犀利豆9 小时前
Claude Code Tools 研究系列(三)ExitPlanMode
人工智能·后端
星栈9 小时前
oh-my-pi工程级AI编码工使用体验
人工智能·后端·agent
xcLeigh9 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang
AI大模型-小华9 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro