[技术回顾系列]--垃圾收集机制

  大家都知道在任何应用程序中,对象都不断的被创建和销毁,因此需要了解如何保持一个对象是可用的,这样我们在之后才能访问它。
如:
public viod Demo()
{
   DemoObject obj=new DemoObject();
   obj.Test();
}
在这个例子中,当Demo()被调用时,就创建了一个DemoObject()实例,随后调用Test()方法。当Demo()方法执行结束时,就出了局部变量obj的作用域了,所以obj就不能访问了,此时obj就成了符合垃圾收集机制的条件了。如果我们再次调用Demo()方法,将创建一个新的DemoObject实例,同样当Demo()方法执行结束时,它又将符合垃圾收集的条件,并被打上了“将被收集”的标志。当然我们可能不知道Demo()创建的DemoObject实例从系统内存中清楚的确切时间,但我们知道这迟早会发生的。并且没有人能访问它的。
PS:尽管我们不能确定应用中GC发生的确切时间,但我们可以通过GC.Collect()来强制GC执行。但是具资料显示,GC操作很耗时,因此最好还是让.NET运行时来做这个工作
吧。除非万不得以,不要手工去执行它。
很显然,每次Demo()被调用时都创建DemoObject实例,但并非十分高效,特别是当创建DemoObject实例要花费很长时间时。为了使obj活得更长时间,我们必须使obj在Demo()方法结束之后不满足GC条件,要达到这种目的途径之一是:
Class test
{
  private DemoObject obj;
  public void Demo1()
  {
   obj=new DemoObject();
   obj.Test();
  }
  public void Demo2()
  {
    Demo();
    if(obj!=null)
    {
     obj.DoOtherthing();
    }  
  }
}
但是这种方法缺点是它不能把我们的对象保持足够长的时间,那如果我想使obj保持无限期长时间怎么办呢?
静态变量是完美手段。静态变量是类被加载到AppDomain中时被实在期限。和实例变量不同,每当类被创建时就被实例化,而静态变量只被创建一次。
PS:AppDomain是一个在OS进程中运行。NET代码的一个隔离区域,OS进程机制可以防止一个进程受其他进程的影响而影响。AppDomain也有类似的作用。当AppDomain所在的应用,如一个WEB应用程序结束时,AppDomain也将结束。每个OS可以有多个AppDomain。同时我们可以通过Ststem.AppDomain 来做很多事情。

posted on 2007-01-22 09:11  kim  阅读(941)  评论(0编辑  收藏  举报

导航