晶片層 開放閱讀

垃圾回收

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 節結構 公司投研頁 沿產業鏈找到受益公司 投資課 把概念轉成可跟蹤模型