垃圾收集（计算机科学）
在计算机科学中，垃圾收集( GC ) 是一种自动内存管理形式。垃圾收集器尝试回收由程序分配但不再被引用的内存——也称为垃圾。垃圾收集是由美国计算机科学家John McCarthy于 1959 年左右发明的，用于简化Lisp中的手动内存管理。
垃圾收集使程序员免于执行 手动内存管理，其中程序员指定释放哪些对象并返回到内存系统以及何时这样做。其他类似的技术包括堆栈分配、区域推断、内存所有权以及多种技术的组合。垃圾收集可能会占用程序总处理时间的很大一部分，因此会对性能产生重大影响。
内存以外的资源，例如网络套接字、数据库句柄、用户交互窗口、文件和设备描述符，通常不由垃圾收集处理。管理这些资源的方法，尤其是析构函数，可能也足以管理内存，而无需 GC。一些 GC 系统允许将此类其他资源与内存区域相关联，该内存区域在收集时会导致回收这些资源的工作。
垃圾回收的基本原理是在程序中找到以后无法访问的数据对象，并回收这些对象使用的资源。
许多编程语言都需要垃圾收集，或者作为语言规范的一部分（例如，RPL、Java、C#、D、 Go和大多数脚本语言），或者有效地用于实际实现（例如，像lambda 演算这样的形式语言） ; 这些被称为垃圾收集语言。其他语言设计用于手动内存管理，但有可用的垃圾收集实现（例如，C和C++）。一些语言，比如Ada，Modula-3和C++/CLI允许垃圾收集和手动内存管理在同一个应用程序中共存，方法是为收集和手动管理的对象使用单独的堆；其他的，比如D，是垃圾收集的，但允许用户手动删除对象，并且在需要速度时也完全禁用垃圾收集。
虽然将垃圾收集集成到语言的编译器和运行时系统中可以提供更广泛的方法选择，但存在 post-hoc GC 系统，例如自动引用计数(ARC)，包括一些不需要重新编译的系统。（事后GC 有时被区分为垃圾收集。）垃圾收集器几乎总是与内存分配器紧密集成。
Lisp 架构
中的停止和复制垃圾收集：内存分为工作内存和空闲内存；新对象分配在前者中。当它已满时（如图所示），将执行垃圾回收：所有仍在使用的数据结构都通过指针跟踪定位并复制到空闲内存中的连续位置。
之后，工作内存内容被丢弃以支持压缩副本，并且交换工作内存和空闲内存的角色（如图所示）。