芯片层 开放阅读

垃圾回收

Garbage Collection

概念 ID
garbage-collection
更新时间
2026-05-29
来源数量
待补

垃圾回收

3 秒看懂

垃圾回收 (Garbage Collection, GC) 是一种自动内存管理机制,它能识别并释放程序中不再使用的内存(“垃圾”)。在AI时代,它是决定昂贵GPU/NPU算力能否被高效“喂饱”的关键软件引擎,直接影响大模型训练推理的成本和规模。

3 分钟产业解释

想象一下,你在一间顶级的铸造厂(GPU集群)里,用最贵的金属(数据)打造最精密的零件(模型参数)。铸造过程中会产生大量边角料和废弃模具(临时计算内存)。如果全靠工人手动清理(手动内存管理),不仅效率低下、容易出错(内存泄漏/悬空指针),还会让昂贵的铸造炉(GPU)闲置。

垃圾回收器就是智能的自动化清道夫系统。 它在程序运行时,持续扫描整个“工厂”(程序内存空间),自动识别哪些边角料确实没人要了(不可达对象),然后高效地清理、回收,腾出空间给新的铸造任务。

在AI产业链中的位置: GC是深度学习框架(如PyTorch, TensorFlow)、编程语言运行时(如Python的CPython、Java的JVM)的核心组件。它位于软件栈的底层,主要管理CPU主机内存的动态分配资源;GPU显存则由框架的显存分配器和CUDA运行时/驱动协同管理。一个低效的GC会导致:

  1. 算力空转:GPU在等待内存清理,无法进行计算。
  2. 成本飙升:为了容纳大模型,不得不使用更多或更贵的显卡。
  3. 规模受限:模型或数据批次的大小受限于GC的效率,而非硬件理论极限。

15 分钟专家深入

核心价值:自动化与安全性

GC解决了手动内存管理的两大痛点:内存泄漏(内存只分配不释放)和悬空指针(释放后继续访问)。在动辄数十亿参数、运行数周的AI训练任务中,任何微小的内存管理错误都可能前功尽弃。GC提供了确定性的安全底线。

在AI计算中的特殊挑战

AI工作负载对GC提出了前所未有的要求:

  • 海量内存:单个模型参数(以FP16/BF16计)就可占用数十GB显存,加上梯度、优化器状态,总量巨大。
  • 复杂数据结构:计算图、张量、中间激活值构成复杂的有向图,对象生命周期交织。
  • 硬件异构性:内存分布在CPU DRAM、GPU HBM、可能还有多级缓存中,GC需要感知或至少不破坏这种分布。
  • 低延迟容忍度:训练中的长时间停顿(Stop-The-World)会破坏流水线,导致GPU利用率下降。

主流技术路线概览

GC算法多样,但在高性能计算领域,通常采用分代(Generational)和增量/并发(Incremental/Concurrent)思想的组合。

技术路线核心思想典型应用环境AI场景下的优劣势
引用计数 (Reference Counting)每个对象维护一个被引用计数,归零即回收。CPython (Python)优势:实时性高,无长停顿。劣势:无法处理循环引用,有额外计数开销;需要辅助机制(如CPython的循环检测器)。
标记-清除 (Mark-Sweep)从根对象遍历标记所有可达对象,然后清除未标记的。Java (早期), Go (并发标记)优势:能处理循环引用。劣势:原始版本需要停顿;内存碎片化。
分代收集 (Generational Collection)基于“多数对象短命”假设,将堆分为新生代、老年代等,对不同代采用不同频率的GC。Java (G1), .NET, V8 (JavaScript)优势:大幅提升效率,减少全堆扫描。劣势:需要维护代际关系,跨代引用处理稍复杂。
并发/增量收集 (Concurrent/Incremental GC)将GC工作拆分成小块,与应用程序线程交替或并发执行。Java (ZGC, Shenandoah), Go优势:极大缩短甚至消除感知停顿。劣势:算法复杂,与应用线程的同步开销大,吞吐量可能略有损失。
显式生命周期管理程序员手动分配/释放,或使用智能指针(C++ RAII)。C++, Rust (所有权系统)优势:零GC开销,性能可预测。劣势:心智负担大,易出错(除非使用Rust等所有权系统);在复杂AI框架中实现自动化的难度极高。

[基于普遍技术共识] 目前,为AI框架设计的GC往往结合了分代、并发的思想,并深度集成跨设备内存池管理策略。

技术原理

GC的核心任务是确定哪些内存对象是“可达的”(仍被程序使用),哪些是“不可达的”(垃圾)。

关键机制:可达性分析

最主流的算法是跟踪式GC(Tracing GC),如标记-清除。

  1. 根集合 (Roots):包括全局变量、栈上的局部变量、寄存器等。这些是分析的起点。
  2. 标记 (Mark):从根集合出发,递归遍历所有能直接或间接引用的对象,并为它们打上“存活”标记。
  3. 清除 (Sweep):扫描整个内存堆,回收所有未标记的对象。

优化:分代与并发

分代:

|------------- 堆 -------------|
| 新生代 (Young Gen) | 老年代 (Old Gen) |
| (频繁、快速收集) | (低频、重量级收集) |
|---- Eden, S0, S1 ----|-----------------|

新创建的对象在Eden区。经历一次GC后仍存活,进入幸存区(S0/S1)。多次存活后晋升老年代。新生代GC(Minor GC)通常很快,因为对象少。全堆GC(Major GC)成本高,但频率低。

并发: 并发GC的目标是让GC线程和应用线程同时运行。关键技术包括:

  • 写屏障 (Write Barrier):在应用线程修改对象引用时,插入一些代码通知GC线程,以维护标记正确性。
  • 读屏障 (Load Barrier):在应用线程读取引用时介入,确保看到的对象状态是GC一致的。
  • 颜色指针/标记位:在指针中嵌入元数据(如ZGC),以极低开销跟踪对象状态。

[基于普遍技术共识] 在PyTorch等框架中,除了Python层的GC,底层C++运行时和CUDA运行时也有自己的内存缓存和池化机制,它们共同构成了一个“混合GC系统”,目标是减少昂贵的跨设备(CPU-GPU)内存分配系统调用。

技术演进史

  1. 手动管理时代 (1950s-1960s):最早期的语言(如汇编、C)要求程序员完全负责内存。
  2. 自动GC诞生 (1959):John McCarthy在Lisp中首次实现了GC,奠定了基础。
  3. 经典算法完善 (1960s-1980s):标记-清除、复制、引用计数等基本算法被提出和优化。
  4. 分代与并发革命 (1980s-2000s):为满足交互式应用和服务器需求,分代GC成为Java等语言的标配,研究重点转向减少停顿。
  5. 超大堆与亚毫秒停顿时代 (2010s-至今):随着大数据和AI兴起,管理TB级堆成为需求。Java的ZGC、Shenandoah,Go的并发GC,以及专为LLM训练设计的自定义内存管理器(如PyTorch的memory_stats监控和CUDA内存池)代表着当前前沿,追求TB级堆、亚毫秒级停顿
  6. 硬件协同与专用化探索:未来方向是与硬件(如CXL内存池、智能网卡)、新型存储介质更深度协同,以及为特定AI工作负载(如稀疏计算)设计专用GC策略。

技术路线对比

特性引用计数传统分代标记-清除先进并发GC (如ZGC)手动管理 (C++/Rust)
停顿时间短且频繁可能较长(Full GC)极短 (亚毫秒级)
吞吐量中等中等偏高最高
处理循环引用需辅助机制需程序员注意
内存开销每个对象有计数器中等(需维护代际)中等(需存储元数据)最低
编程复杂度
AI场景适用性Python层常用,但底层不足传统服务器/框架大规模、低延迟敏感型应用极致性能追求,或系统级库

[未充分披露] 具体到AI训练框架内部(如PyTorch CUDA缓存分配器)的精确性能对比数据未公开,但其设计目标是最大化重用已分配显存块,减少与CUDA驱动交互的次数

上下游

  • 上游(依赖与影响因素)
    • 编程语言规范:语言是否内置GC(Java, Go, Python)或仅提供可选库。
    • 操作系统与驱动:虚拟内存管理、页面交换策略。
    • 硬件:CPU/GPU内存层级(SRAM, DRAM, HBM)、CXL等互连技术。
  • 下游(影响与赋能)
    • 所有应用软件:特别是需要长时间运行、处理复杂数据结构的应用。
    • AI框架与模型:训练/推理的批大小 (Batch Size)序列长度模型并行度的理论上限和实际稳定性。
    • 云计算成本:直接影响实例的内存利用率和租用数量。

关键指标

评估GC性能的核心维度:

  1. 停顿时间 (Pause Time):应用因GC而完全暂停的时长。对于实时推理和交互式训练至关重要。
  2. 吞吐量 (Throughput):应用代码执行时间占总运行时间的比例。目标是最大化计算,最小化GC开销。
  3. 内存开销 (Footprint):GC机制自身需要的额外内存(如元数据、空闲列表)。
  4. 分配速率 (Allocation Rate):系统能支持的内存分配速度。AI训练中的张量创建速率极高。
  5. 碎片化 (Fragmentation):可用内存被分割成小块,导致即使总空闲内存足够,也无法分配大块连续内存(对于需要连续显存的AI算子至关重要)。

供需与市场数据

[未充分披露] GC本身不是独立商品,其供需隐含在编程语言/框架的流行度算力硬件市场中。

  • 需求侧:全球AI开发者数量、大模型规模增长曲线驱动了对更高效GC技术的需求。任何能降低10%内存浪费的技术,都可能转化为数亿美元的硬件采购节约。
  • 供给侧:由顶级科技公司(Google、Meta、Microsoft)和开源社区提供先进GC实现。竞争体现在哪个语言/框架能支撑更大规模、更稳定的训练。
  • 市场影响:GC效率是云服务商(AWS、Azure、GCP)实例类型和定价的隐藏参数之一。支持高效GC的运行时环境,能帮助云厂商提升同一物理服务器的虚拟机部署密度。

代表公司与资本映射

  • 语言与框架提供商
    • Oracle (Java):拥有世界上最复杂、最先进的商用JVM GC(ZGC, G1)。
    • Google (Go):Go语言内置的并发GC是其核心竞争力之一,服务于自家AI基础设施。
    • Microsoft (.NET):.NET GC在Windows生态和Azure云中至关重要。
    • Meta (PyTorch):在PyTorch运行时和内部训练框架中投入巨大,优化AI工作负载的内存管理。
  • AI算力提供商
    • NVIDIA:其CUDA运行时、cuDNN等库包含内存管理器,与上层GC协同。硬件HBM的容量和带宽是GC的物理基础。
  • 产业映射:拥有成熟 GC 技术的平台型公司,以及提供低开销内存管理工具的语言、框架和云服务厂商,是观察软件效率如何传导到算力利用率的样本。

产业观察

  1. 效率即成本:GC是软件栈中影响“单位算力能产出多少有效计算”的关键环节。提升GC效率等同于提升资本支出(CapEx)回报率。底层软件优化能力可作为分析AI基础设施公司工程效率的指标之一。
  2. 规模天花板突破者:当前大模型训练的瓶颈常在于显存。谁能通过软硬件协同(包括GC优化)有效管理更大显存,谁就能训练更庞大的模型,占据先发优势。
  3. 护城河体现:优秀的GC实现是长期工程积累和深刻硬件理解的产物,难以快速复制。它是一个平台(如JVM、PyTorch)核心竞争力的组成部分。
  4. 关注点:在评估AI框架或云服务时,不仅要看其支持的硬件型号,更要关注其内存管理白皮书、性能基准测试中关于大规模训练的稳定性和扩展性报告

常见误读纠偏

误读1: “GC是性能杀手,应该全部用手动管理。”

  • 纠偏:现代先进GC(如并发GC)的停顿时间已经极短(<10ms),对于非实时性要求极高的AI训练任务,其带来的安全性和开发效率收益远大于极微的性能损失。在AI推理中,更多采用对象池预先分配来规避GC,而非完全手动管理。关键在于选择与工作负载匹配的GC策略。

误读2: “用了Python(有GC)就万事大吉,不会内存泄漏。”

  • 纠偏:1) Python的GC主要处理Python对象,无法管理由C++/CUDA库底层分配的GPU显存。2) 循环引用如果涉及__del__方法,可能导致GC无法回收。3) 最常见的情况是持有对不再需要的大型张量的引用(如保留在一个列表中),GC无法判定其为垃圾,从而导致显存泄漏。程序员仍需有内存管理意识。

误读3: “GC只关注CPU内存,与GPU无关。”

  • 纠偏:这是一个致命误解。在AI训练中,CPU内存和GPU显存是联动的。张量通常在CPU内存创建,然后拷贝到GPU。语言运行时的GC(如Python的GC)只跟踪CPU内存中的Python对象引用,不负责跟踪GPU显存上的对象或跨设备引用;跨设备的内存管理由框架的Tensor生命周期和显存管理器协作完成。PyTorch等框架的内存管理器需要协调CPU端的GC和CUDA端的内存池,以避免主机端过早释放还在被GPU使用的内存。

学习路径

  1. 基础:理解操作系统虚拟内存、堆/栈内存概念。
  2. 入门:学习一种有GC的语言(如Java/Go/Python),了解其GC基本工作方式。
  3. 深化:阅读《The Garbage Collection Handbook》经典教材,系统学习各种算法。
  4. 聚焦AI
    • 研读PyTorch/TensorFlow官方文档中关于内存管理的部分(如torch.cuda.memory_summary)。
    • 阅读相关论文,如“Don’t Waste Your Bubbles: Runtime-aware Memory Management for Efficient Training of Large Language Models”。
    • 关注CUDA文档中的内存管理API(cudaMalloc, cudaFree)和流/事件同步。
  5. 实践:使用分析工具(如tracemalloc for Python, VisualVM for Java, nsys for CUDA)诊断自己AI程序的内存和GC问题。

一句话总结

垃圾回收是AI算力洪流下的“隐秘河道疏浚系统”,它虽不直接产生智能,却决定了智能生产的效率、规模和成本,是支撑大模型时代不可或缺的底层核心软件技术。

延伸阅读与来源

  1. 经典书籍:《The Garbage Collection Handbook: The Art of Automatic Memory Management》 (Richard Jones, Antony Hosking, Eliot Moss)
  2. Java官方文档Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide
  3. Go语言设计文档Getting to Go: The Journey of Go’s Garbage Collector
  4. AI框架相关
    • PyTorch Memory Management: PyTorch Memory Summary
    • 相关研究:可搜索关键词 “LLM training memory management”, “GC for heterogeneous memory”。
  5. 行业报告:各大云厂商(AWS, GCP, Azure)关于实例性能优化的技术博客中常包含内存管理实践。
  6. 来源标注说明:本文中关于具体GC算法的描述属于计算机科学领域广泛接受的技术原理;关于AI场景下的挑战和优化方向,属于对当前技术发展趋势的定性归纳与推断[基于普遍技术共识];具体厂商产品的内部实现细节属于未充分披露信息。
source: 公开披露与公开资料整理 本页仅用于产业链学习、信息检索和研究辅助;不构成投资建议,不预测涨跌,不提供买卖、仓位或目标价建议。
完整概念页 复盘 13 节结构 公司投研页 沿产业链找到受益公司 投资课 把概念转成可跟踪模型