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

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

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

新生代特点:

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

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

标记-复制算法原理:

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

  • 标记存活对象。

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

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

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

回收效率高,速度快:

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

不产生内存碎片:

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

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

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

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

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

总结:

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

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

相关推荐
不能放弃治疗9 小时前
单 Agent 实现模式
后端
IT_陈寒11 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
小bo波12 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
fliter12 小时前
最后一块拼图:用 bitvec 构造 IPv4 包,真正做出自己的 Ping
后端
fliter13 小时前
用 Rust 解析并生成 ICMP 包:checksum、nom 与 cookie-factory
后端
蝎子莱莱爱打怪13 小时前
XZLL-IM干货系列 03|消息 ID 设计:一个 UUID 搞不定的事,我用两个 ID 解决了
后端·面试·开源
fliter13 小时前
从 panic 到 Result:用 Rust 重新整理一个 ping 项目的错误处理
后端
森蓝情丶14 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
JensCS猿14 小时前
从 Spring Boot 回看 SSM 框架:手动挡与自动挡的驾驶哲学
后端
爱勇宝14 小时前
干了近 8 年,一夜之间被裁:AI 时代,程序员最该害怕的不是 AI
前端·后端·程序员