static procedure 是不需要类实例化就可以访问的函数,所以调用static procedure时没有产成新的类实例,只是简单的调用函数,在函数返回时,释放所占用的内存,例如static void Main()函数,它不需要一个实例就可以运行,在Main()函数执行完时,程序就终止了,内存释放。
  .NET的编译过程需要执行2步,第一步是将语言编译成IL(中间语言),第二步是CLR(通用语言运行时)将IL编译成机器码,他可以根据机器的CPU类型对代码进行优化。
  ASP.NET在第一次调用时进行CLR编译,并存放在高速缓存当中,以后调用就不需要在进行编译了。

解决方案 »

  1.   

    静态方法在装载后是否驻留内存?
    对如果是,那么驻留的是编译为机器码的代码吗?
    对如果是这样,是不是就是说,静态方法工作效率会高很多?编译一次后在Application执行期内能够不用再即时编译?
    会高,但不会高很多,静态方法只是不需要类的实例化,可以把静态方法本身就看成一个实例
      

  2.   

    你的描述,我有些地方不太清楚。首先,你使用static void Main()函数作为说明,与我的问题有些混淆,你的例子是否应该用于说明WinForm的情况?据我看,asp.net实际上在运行时是一个Application整体,每一次页面请求只不过是触发了这个Application的一个事件,如Page.Load(),它不会在页面请求后释放Application,而只是利用垃圾收集器释放了那些无用的内存,比如某次页面请求后生成的实例,但是Application并没有结束,它的结束期可能是20分钟以后,所以在Application运行期,static方法会一直在内存中,在Application运行期内就不需要再编译了。但是如果Application运行期结束后再调用那个Application,如果是.aspx需要两次编译,如果是.dll,那么只需要jit一次就可以了。因为按我的理解,使用static方法效率会高些,因为不生成实例,但是它会在Application运行期内一直占用内存,所以如果有很多静态方法,需要考虑内存使用情况。以上我的观点,不知是否恰当,我还请大家帮帮我。
      

  3.   

    谢谢 cnuninet(www.helloaspx.com),我的概念更清楚一些了。另外,我还要请教:因为jit只编译那些对某次请求有用的东西,我不知道那个有用的东西的范围,是一个类?还是类中有用的方法和属性,比如,我的一个类中,有静态和非静态的两种方法,程序在调用其中的静态方法时,是否一同编译了那些非静态的方法?
      

  4.   

    我的意思是在静态函数内部使用的内存将会被释放。
    Application对象在每次用户页面请求时自动创建一个实例,这是由IIS管理的。
    PAGE是Application对象中的一个类,他当然不会释放Application占用的内存。
    垃圾收集只是处理托管堆上的引用类型数据,而函数的调用过程不是数据,函数体内的局部变量是在函数执行完后自动释放内存的。NET的两次编译是指用编译器编译完成是第一次编译,执行时才进行第二次编译,及JIT。
      

  5.   

    谢谢blactte(想认识我吗?在靠近一点!)。 我觉得又靠近了一点! :-)