熟悉.NET的开发者们应该都知道里面有一个GC.Collect()吧,它的功能就是强制对所有代进行垃圾回收。下面介绍与之相关的几个术语:
何谓代?
代是指托管内存中不同的区域,对象越老位于的代越靠后,比如:第一次垃圾回收后某个对象未被回收,它可能就会从0代移动到1代,以此类推。
何谓垃圾?
垃圾就是只没有任何对象再和他有引用关系,专业点说就是从这个对象开始找其引用,一直找,如果找到它正在引用一个根,那么这个就是不是垃圾,如果找不到根则这个对象就是垃圾。
何谓根?
根就是指一个存储位置,包含指向某个引用类型的指针。比如静态变量,全局变量就是根,当前寄存器里面的对象就是根,还有当前调用栈上的参数,局部变量都是根。
另外,垃圾回收开始的时候当前所有线程都将被挂起,开始收集托管堆上的垃圾,收集完了还要压缩内存,然后等待垃圾回收结束以后再恢复这些线程,从这个角度来说,还是少调用垃圾回收,但是不是不能调,要视情况而定。
GC.Collect()的一般用法如下面源码如示:
......
dpFormulaList.Clear();
dpFormulaList = null;
inputs.Clear();
inputs = null;
GC.Collect();
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace TestDOME { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { using(Demo de2 = new Demo()) { de2.dt(); } Demo de3 = new Demo(); de3.Dispose(); Demo1 d1 = new Demo1(); d1 = null;//设置为空时才可以手动释放 GC.Collect(); } } public class Demo : IDisposable//继承接口 { public void dt() { } ~Demo() { Dispose(false); } #region IDisposable Members public void Dispose() { Dispose(true); GC.SuppressFinalize(true); } private bool _disposed = false;//资源释放标志 protected virtual void Dispose(bool disposeManageResourse) { if (!_disposed) { if (disposeManageResourse) { //释放托管资源 MessageBox.Show("回收资源1"); } _disposed = true; } } #endregion } public class Demo1 { ~Demo1() { MessageBox.Show("回收资源d1"); } } }