GC
程序员文章站
2022-05-06 17:21:44
...
class Add : IDisposable
{
//本类使用的其他托管资源
public Component a=new Component();
//指向外部的非托管资源
private IntPtr handle;
private bool IsDisposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool v)
{
if (!IsDisposed)
{
if (v)
{
Console.WriteLine("托管");
//释放托管资源
a.Dispose();
Console.WriteLine(a);
}
CloseHandle(handle);
handle = IntPtr.Zero;
//释放非托管资源
Console.WriteLine("非托管");
}
IsDisposed = true;
}
[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static bool CloseHandle(IntPtr handle);
~Add()
{
Dispose(false);
}
public void Fun()
{
Console.WriteLine("fangfa");
}
}
20世纪90年代中期GC才以主角的身份登上了历史的舞台,这不得不归功于Java的进步,今日的GC已非吴下阿蒙。Java采用VM(Virtual Machine)机制,由VM来管理程序的运行当然也包括对GC管理。90年代末期.NET出现了,.NET采用了和Java类似的方法由CLR(Common Language Runtime)来管理。这两大阵营的出现将人们引入了以虚拟平台为基础的开发时代,GC也在这个时候越来越得到大众的关注。
为什么使用GC:
1、提高了软件开发的抽象度;
2、程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题;
3、可以使模块的接口更加的清晰,减小模块间的偶合;
4、大大减少了内存人为管理不当所带来的Bug;
5、使内存管理更加高效。
总的说来就是GC可以使程序员可以从复杂的内存问题中摆脱出来,从而提高了软件开发的速度、质量和安全性。
什么是GC?
GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象[2],通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理。为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法。