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

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

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

新生代特点:

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

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

标记-复制算法原理:

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

  • 标记存活对象。

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

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

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

回收效率高,速度快:

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

不产生内存碎片:

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

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

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

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

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

总结:

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

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

相关推荐
vx_Biye_Design2 分钟前
springboot一站式旅游管理平台81037-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·课程设计·express·旅游
写后端的胖头鱼7 分钟前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
嵌入式学习菌10 分钟前
ESP32 ModbusTCP 分片缓存
java·后端·spring
vx_Biye_Design11 分钟前
springboot宠物寄养服务预约与监管系统82684-计算机课程设计、毕业设计
java·vue.js·spring boot·elasticsearch·课程设计·express·宠物
程序员小杰@18 分钟前
Spring Boot 常用注解分类速记
java·spring boot·后端
挖掘狂人21 分钟前
Git 从 0 到 1:用一个小项目走完 add / commit / reset / merge / rebase / push
git·后端·github
vx_Biye_Design23 分钟前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
吴声子夜歌24 分钟前
Nginx应用与运维——Nginx日志管理
java·运维·nginx
打工仔折腾 AI35 分钟前
用UU远程把家里电脑变成AI Agent常驻服务器:CLI、端口映射与代理实测
运维·服务器·人工智能·后端·python·电脑·ai agent 实战