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

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

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

新生代特点:

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

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

标记-复制算法原理:

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

  • 标记存活对象。

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

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

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

回收效率高,速度快:

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

不产生内存碎片:

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

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

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

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

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

总结:

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

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

相关推荐
西瓜太郎12341 分钟前
request_id 如何串起请求、路由、计费和日志
后端·python
troy1282 分钟前
Python 基础语法(一):变量、数据类型与运算符
java·服务器·python
by组态8 分钟前
Ricon组态系统通信配置指南
前端·后端·物联网
还是奇怪11 分钟前
OpenAI GPT-5.6 构建指南拆解:创业公司如何用模型选择与 Responses API 降低 Agent 成本
java·数据库·人工智能·gpt
可涵不会debug12 分钟前
LangChain 文本分割器详解:字符分割、Token 分割、硬约束递归分割实战
java·前端·数据库
sbjdhjd16 分钟前
ThinkPHP 5.0.10 缓存写入型 RCE 复盘:从手动搭建、换行绕过到源码单步验证 | 05
java·后端·安全·spring·网络安全·数据挖掘·php
LEE16 分钟前
Agent 的控制权,为什么正在回到模型手里?
前端·后端
沃夫上校17 分钟前
跨域这件事,其实浏览器在替你挡刀
前端·后端·nginx
用户2986985301418 分钟前
Python 将 Word 文档转换为图片的实践指南
后端·python·api
旺仔不是程序员24 分钟前
致命索引失效:索引列运算与函数索引不匹配
数据库·后端·面试