浅谈C#垃圾回收理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理、程序集加载、安全性、异步处理和线程同步。 CTS(Common Type System)通用类型系统,它把.Net中的类型分为2大类,引用类型与值类型。.Net中所有类型都间接或直接派生至System.Object类型。所有的值类型都是System.ValueType的子类,而System.ValueType本身却是引用类型。
非托管资源:
在.Net中释放非托管资源主要有2种方式,Dispose,Finalize Dispose方法,对象要继承IDisposable接口,也就会自动调用Dispose方法。 Class Suifeng:System.IDisposable { #region IDisposable 成员 public void Dispose() { // } #endregion } Suifeng suiFeng= new Suifeng (); suiFeng.Dispose(); 也可以使用Using语句 (using Suifeng suiFeng= new Suifeng()) { // } Finalize()方法 MSDN上的定义是允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。
protected override void Finalize() { try { // Cleanup statements... } finally { base.Finalize(); } }
Public class BaseResource:IDisposable { PrivateIntPtr handle; // 句柄,属于非托管资源 PrivateComponet comp; // 组件,托管资源 Privateboo isDisposed = false; // 是否已释放资源的标志 PublicBaseResource { } //实现接口方法 //由类的使用者,在外部显示调用,释放类资源 Public void Dispose() { Dispose(true);// 释放托管和非托管资源 //将对象从垃圾回收器链表中移除, // 从而在垃圾回收器工作时,只释放托管资源,而不执行此对象的析构函数 GC.SuppressFinalize(this); } //由垃圾回收器调用,释放非托管资源 ~BaseResource() { Dispose(false);// 释放非托管资源 } //参数为true表示释放所有资源,只能由使用者调用 //参数为false表示释放非托管资源,只能由垃圾回收器自动调用 //如果子类有自己的非托管资源,可以重载这个函数,添加自己的非托管资源的释放 //但是要记住,重载此函数必须保证调用基类的版本,以保证基类的资源正常释放 Protectedvirtual void Dispose(bool disposing) { If(!this.disposed)// 如果资源未释放 这个判断主要用了防止对象被多次释放 { If(disposing) { Comp.Dispose();// 释放托管资源 } closeHandle(handle);// 释放非托管资源 handle= IntPtr.Zero; } this.disposed= true; // 标识此对象已释放 } } 参考了MSDN和网上的一些资料,第一次写博文请各位大侠多多指点!
|
|