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

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

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

新生代特点:

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

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

标记-复制算法原理:

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

  • 标记存活对象。

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

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

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

回收效率高,速度快:

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

不产生内存碎片:

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

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

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

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

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

总结:

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

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

相关推荐
ps酷教程6 小时前
Jackson 解决没有无参构造函数的反序列化问题
java
NiceCloud喜云6 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
为思念酝酿的痛7 小时前
POSIX信号量
linux·运维·服务器·后端
小羊在睡觉7 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
jiayong237 小时前
面试中遇到不熟悉问题的应对策略深度解析
面试·职场和发展
_日拱一卒7 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
swipe7 小时前
Neo4j + Graph RAG 医疗知识图谱工程实践:患者教育问答真正需要的是“关系可追溯”
后端·langchain·llm
隔窗听雨眠7 小时前
Nginx网关响应慢排查手记
java·服务器·nginx
智慧物业老杨8 小时前
智慧物业合同周期管理系统:从风险预警到智能交接的全流程数智化落地方案
java·人工智能·python
源码宝8 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码