.Net的所有引用类型的托管对象都在托管堆中分配。公共运行库负着为托管堆中的每个对象维持一个引用计数器。同时公共运行库维护一个垃圾收集线程,该线程负责检查对象的引用计数,一旦某对象的引用计数为0,那么该对象占用的资源就被垃圾收集线程释放。
对值类型的对象,公共语言将在托管堆栈中分配内存。一旦超过对象的作用域,该对象占用的内存将自动释放。如果该值类型的对象包含了其他引用型对象的引用,公共运行库在销毁值对象的时候,还会将它从所引用对象的引用列表中移走。如果这个动作导致所引用的对象的引用队列为空,则该对象就可能被垃圾收集线程回收。
——摘录至《精通.Net核心技术》