小弟现在在用.Net开发WinForm+WebService程序,偶然发现,我开发系统内存总是向上增长,大概涨到150M左右时DotNet出现异常,崩溃。
   后来,小弟测试了一下,原因是这样的:Form窗体打开一个,内存增长一些(大概2M,窗体有些大),关闭后也增长(幅度比较小),我已经在Closed事件中写了,this.Dispose();this.Close();
   请教各位大虾能不能彻底的释放到Form所占用的内存,请指教谢谢。分不够再加。
   谢谢!!!!

解决方案 »

  1.   

    你程序进行了哪些操作占用这么大?
    加个强制回收gc.Collect();
      

  2.   

    to : Red_angelX(八戒) 
    首先感谢各位的解答。我也使用了gc.Collect();可是效果根本就不明显。
    期待各位大虾。
      

  3.   

    to : Red_angelX(八戒) 
    没有使用其它的线程,我也是偶然发现的,后来我用Delphi测试了一下,Delphi也有同样的问题,但是如果在Delphi中使用了FreeAndNil()后,窗体所占用的内存是可以被回收掉的,为什么dotNet不可以呢?不解。您可以做一个简单的程序,测试一下。再次感谢。
      

  4.   

    to:hbxtlhx(平民百姓)
    我的程序是托管的,可是我的程序内存如果不管它会一直涨,直到崩溃为止,我的意思是调用一个窗体他就涨一次,在调用同样的窗体他还是涨,怎么做才能回收掉关闭窗体的内存呢?
      

  5.   

    如果对象有Dispose方法,那么你要调用这个方法.
    关闭窗体的时候系统会调用窗体的Dispose方法来释放资源,所以你把在程序里用到的没有用Dispose方法的全局对象放到窗体的Dispose方法里调用就是了.
      

  6.   

    to:hbxtlhx(平民百姓) 
    可是我的窗体中没有代码(空窗体,只是上面放了许多控件)。
      

  7.   

    星期一节帖,请大家关注。真的不明白DotNet的垃圾回收什么时候执行。
      

  8.   

    给你个治标不治本的方法,释放内存的,跟最小化窗体一个效果:
    声明:
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern int SetProcessWorkingSetSize(IntPtr hProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);调用:
    SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
      

  9.   

    to:qiezic(破晓) 
    谢谢,再请教一个问题,你们如何处理dotnet的内存释放?
      

  10.   

    to:qiezic(破晓) 
    方法效果很明显,为什么你说“治标不治本”?
      

  11.   

    MSDN 对该函数的表述(翻译):使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放;当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立进程,线程,内核池,就必须小心的使用该函数.也就是说,该函数不是节省内存,而是强制把进程的物理内存搬到虚拟内存中.另外有一些资料上说,该函数“将有可能导致缺页中断,严重影响性能”.
    函数原型:
    BOOL SetProcessWorkingSetSize(
    HANDLE hProcess,
    SIZE_T dwMinimumWorkingSetSize,
    SIZE_T dwMaximumWorkingSetSize
    );
      

  12.   

    没遇到过这种问题,我感觉每次给close了以后就可以了