You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中静态字段为何不会被垃圾回收?

为什么C#静态字段不会被垃圾回收(即使后续不再使用)?

堆也存储静态字段。与堆上分配的可被垃圾回收的对象不同,静态字段会存活至进程结束。
——《C#12 in a Nutshell》

核心原因:

  • 静态字段依附于类型对象,生命周期绑定进程
    静态字段并非独立存在,而是存储在CLR加载类型时创建的**类型对象(Type Object)**中。类型对象的生命周期和进程绑定——除非在特定的AppDomain卸载场景下(普通控制台程序默认AppDomain随进程终止),CLR不会主动卸载已加载的类型。因此,作为类型对象一部分的静态字段,会一直存活到进程结束。

  • CLR无法可靠判定"静态字段不再被使用"
    即使你的代码后续没有显式访问MyClass.Counter,CLR也无法在运行时100%排除未来的访问可能——比如反射调用、动态生成代码、其他线程的异步访问等。为了避免出现"访问已回收静态字段"的致命错误,CLR选择保守策略,保留静态字段直至进程终止。

  • 性能与实现复杂度的权衡
    若要跟踪每个静态字段的引用情况,在其无引用时回收,会大幅增加GC的运行时开销和实现复杂度。而大多数场景下,静态字段要么占用资源极小(如示例中的int),要么是设计上需要长期存在的对象,"存活至进程结束"的设计在性能和开发成本上是更优的选择。

针对大对象的折中方案

如果静态字段引用的是大体积的引用类型对象,你可以手动将静态字段设为null,让GC回收该对象实例:

// 假设静态字段是大对象
public static LargeResource BigResource = new LargeResource();

// 不再使用时
BigResource = null;

需要注意的是,静态字段本身的存储空间(仅一个引用大小)依然会保留在类型对象中,直到进程结束。


内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:26:18