名词
垃圾收集目标
- 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(); } } }
资料
.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探索(垃圾回收系列)