CLR的GC机制
CLR的垃圾回收(GC)机制详解
CLR(Common Language Runtime)是.NET框架的核心组件,负责管理代码执行、内存分配和安全。其垃圾回收(GC)机制是一种自动内存管理技术,旨在高效回收不再使用的对象,防止内存泄漏和碎片化。以下将逐步详述CLR的GC机制,包括其原理、过程、优化策略及相关概念。
1. GC的基本原理
GC机制基于“对象可达性”原则:如果一个对象无法被任何根(如全局变量、栈帧或寄存器)引用,则被视为垃圾。CLR使用追踪式GC(Tracing Garbage Collector),而非引用计数,以避免循环引用问题。核心目标是最小化暂停时间(Stop-the-World Pauses),确保应用程序性能。
- 分代回收模型:CLR将堆内存分为三代:
- $Gen0$:存储新创建的对象。GC频率最高,约80%的对象在此代被回收。
- $Gen1$:存储从$Gen0$存活下来的对象。GC频率较低。
- $Gen2$:存储长期存活的对象。GC频率最低,但回收成本最高。
- 此外,还有大对象堆(Large Object Heap, LOH),用于存储大小超过85KB的对象(如数组),其GC行为与$Gen2$类似。
- GC触发条件:当以下情况发生时,GC自动启动:
- 内存分配失败(如$Gen0$满时)。
- 系统内存压力(如操作系统报告低内存)。
- 开发者手动调用
GC.Collect()
(但不推荐,因可能破坏性能)。
2. GC过程详解
GC过程分为三个阶段:标记(Mark)、清除(Sweep)和压缩(Compact)。每个阶段针对不同代优化。
- 标记阶段:GC从