名词
垃圾收集目标
- ephemeral GC
发生在Gen 0 和Gen 1 的垃圾收集
- Full GC
发生Gen 2 及以上的Gen与LOH的垃圾收集
垃圾收集模式
- 工作站模式
GC直接发生在内存分配的线程(也是当前的工作托管线程)上
- 服务器模式
每个CPU核都有一个自己独立的GC线程与托管堆
垃圾收集的并发需求
- 并发的意思是background GC在进行垃圾收集时,其它托管线程是否可以同时工作(包括分配内存)
- 仅需为Full GC考虑并发,因为ephemeral GC的时间短、代价小,可一直为阻塞模式。
- .NET4后的并发可让background GC与ephemeral GC同时工作
配置
<configuration><runtime><gcConcurrent enabled="true"/><gcServer enabled="true"/></runtime>
</configuration>
继承与垃圾回收模型
using System;namespace 继承与垃圾回收模型 {class Base : IDisposable {private bool _disposed;protected virtual void Dispose(bool disposing) {Console.WriteLine(string.Format("Base.Dispose({0})", disposing));if (!_disposed) {if (disposing) {#region 清理Base自己的托管资源#endregion}#region 清理Base自己的非托管资源#endregion}_disposed = true;}public void Base干活() {if (_disposed) {throw new ObjectDisposedException("Base");}}~Base() {Console.WriteLine("~Base()");Dispose(false);}public void Dispose() {Console.WriteLine("");Dispose(true);GC.SuppressFinalize(this);}}class Child : Base {private bool _disposed;protected override void Dispose(bool disposing) {Console.WriteLine(string.Format("Child.Dispose({0})", disposing));if (!_disposed) {try {if (disposing) {#region 清理Child自己的托管资源#endregion}#region 清理Child自己的非托管资源#endregion_disposed = true;}finally {base.Dispose(disposing);}}}public void Child干活() {if (_disposed) {throw new ObjectDisposedException("爸爸");}}//“可以”为Child写析构方法,但没必要。内部的“Dispose(false)”也没必要~Child() {Console.WriteLine("~Child()");}}class 回收示例 {/// <summary>/// 输出:/// -----以下为手动回收/// Child.Dispose(True)/// Base.Dispose(True)////// -----以下为自动回收/// ~Child()/// ~Base()/// Child.Dispose(False)/// Base.Dispose(False)/// </summary>/// <param name="args"></param>static void Main(string[] args) {Console.WriteLine("-----以下为手动回收");var 手动 = new Child();手动.Dispose();Console.WriteLine("/n/n-----以下为自动回收");var 自动 = new Child();GC.Collect();}}
}
资料
实现 Dispose 方法
垃圾回收通知
.Net Discovery 系列之七--深入理解.Net垃圾收集机制(拾贝篇) 发布在新年第一秒
.Net Discovery 系列之四--深入理解.Net垃圾收集机制(下)
So, what’s new in the CLR 4.0 GC?
.NET 4/4.5里新的垃圾收集机制
对象代(Generation)与GC
Using GC Efficiently – Part 2
CLR探索系列:Server and Workstation Garbage Collection探索(垃圾回收系列)