ScholarGate
助手

垃圾回收与内存管理

内存管理控制程序如何分配和回收内存;垃圾回收通过识别和释放不再可达的对象来自动化回收过程。

用 PaperMind 寻找选题即将推出Find papers & topics
Tools & resources
下载幻灯片
Learn & explore
视频即将推出

Definition

内存管理是程序内存的分配和回收;垃圾回收是一种自动回收机制,它释放程序不再可达的对象所占用的内存,从而使程序员免于显式解除分配。

Scope

本主题涵盖语言运行时的自动和手动内存管理:引用计数、标记-清除、复制和分代收集;可达性跟踪;以及吞吐量、暂停时间和内存开销之间的权衡。它讨论了并发和增量收集器以及收集策略与语言设计之间的关系。

Core questions

  • 收集器如何确定哪些对象仍然需要?
  • 吞吐量、延迟和内存占用之间有哪些权衡?
  • 为什么按年龄分离对象(分代收集)能提高效率?
  • 收集如何避免交互式或实时系统中的长时间暂停?

Key theories

追踪式垃圾回收
麦卡锡为Lisp引入了自动垃圾回收,确立了通过追踪哪些对象从程序根部仍然可达来回收内存的理念。
分代收集
Lieberman和Hewitt观察到大多数对象生命周期短暂,并提出更频繁地收集年轻代,这在实践中大大降低了收集成本(分代假说)。
收集技术分类
Wilson和《垃圾回收手册》组织了引用计数、标记-清除、复制、增量和并发收集器及其性能权衡的设计空间。

Clinical relevance

自动内存管理消除了悬空指针和内存泄漏等一整类错误,这也是大多数高级语言依赖垃圾回收的原因。收集器的选择强烈影响应用程序的延迟和吞吐量,特别是对于交互式和服务器系统。

History

麦卡锡于1960年将垃圾回收引入Lisp。随后出现了复制收集(Cheney)和引用计数,Lieberman和Hewitt在1983年提出的分代收集器利用了对象的生命周期。随后的几十年产生了增量、并发和基于区域的收集器,这些在Wilson 1992年的著作和2011年的《垃圾回收手册》中得到了全面综述。

Debates

自动收集与手动或基于所有权的内存管理
设计者们就垃圾回收(安全方便但可能带来暂停和开销)与手动或基于所有权的内存管理(以程序员负担和风险为代价提供可预测的性能和更低的占用)展开辩论。

Key figures

  • John McCarthy
  • Henry Lieberman
  • Carl Hewitt
  • Richard Jones
  • Paul Wilson

Related topics

Seminal works

  • mccarthy1960
  • lieberman1983
  • wilson1992
  • jones2011

Frequently asked questions

垃圾收集器如何知道要释放哪些对象?
追踪式收集器从已知的根(例如栈变量和全局变量)开始,并沿着引用标记所有可达对象;任何未被触及的对象都是不可达的,可以被回收。
为什么分代垃圾回收有效?
因为大多数对象在分配后不久就变得不可达,频繁收集年轻代可以廉价地回收大部分垃圾,而较旧的、生命周期长的对象则很少被扫描。

Methods for this concept

Related concepts