我定义了两个WinForm,第一个Form(名字为form1)上有一个按钮,唯一的功能就是弹出form2,在form2中的装载事件(Form_Load)中声明了一个有1000行记录的DataTable,然后将该DataTable绑定到form2的一个DataGrid上.
可是我发现,从form1打开form2,再关闭form2后增加的内存并没有因为form2的关闭而释放,请问这是为什么?

解决方案 »

  1.   

    using (Form2 f = new Form2())
    {
    f.ShowDialog();
    }
      

  2.   

    因为在.NET中,内存并不是由程序员来释放的,而是由CLR的GC机制,你关闭Form之后,GC机制判断并不需要回收内存,所以内存不变是正常的。
      

  3.   

    你可以强制内存回收GC.Collect();
      

  4.   

    你可以看看这里对类似问题的讨论:http://community.csdn.net/Expert/TopicView.asp?id=4397097也可以看看我的回复,欢迎讨论。^_^
      

  5.   

    GC.Collect()没用,系统只会在内存紧张时才会对垃圾进行回收!
      

  6.   

    据我所知,好像有个强制回收的命令的,不过手上的电脑没MSDN,查不到具体的语句了
      

  7.   

    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);//ShowWindow(this.Handle,6);使用这个倒的确是可以把内存释放,但我总不能在操作一段时间后就将窗体最小化吧,多莫名其妙呀
    有没有更好一点的解决方法?
      

  8.   

    最关键的问题在于你只要使用.NET,内存的控制权就不在我们手里了,大家都说GC.Collect可以回收内存,也确实是,CLR保证了这一点,但是它并没有保证马上回收,它会在它认为合适的时候才去做这件事情,可能是1分钟,也可能是1天......
      

  9.   

    GC里肯定有个方法的,只是我忘了,以前释放COM对象时就用过
      

  10.   

    object.Dispose()对于一些关键对象使用啦,比如数据库连接等,但对于本地的对象基本没有这种控制.
    使用这个方法和不使用这个方法,我用例子测试过,没有明显的效果,郁闷
      

  11.   

    不是十分明白你说的情况,不过从我了解的意思来看是不是这样的?
    你用Form1调用Form2,然后是想在Form2界面下直接关闭这个程序还是想退回到Form1下再关闭这个程序?
    如果是后者的话,我也遇到过。
    我是这么解决的。
    form1
    {
       button
       {
         Form2 newForm = new Form2();
         Form1.hide();
         this.showDialog(this);
         Form1.show();
       }
    }Form2
    {
       this.close();}
    没在我自己的机器上,记不太清了,不过应该没有问题。
      

  12.   

    jimh(Jimmy):
    打开Form1,假定程序占用内存为1,600K
    通过Form1上的按钮,打开Form2,此时内存为11,600K
    关闭Form2,此时的内存仍为11,600K,即便我在关闭事件(Closing)里面写上了this.Dispose,仍是一样的结果
      

  13.   

    拜托各位大仙看完贴子明白我的意思之后再回贴,我晕死,都说过用Dispose()并不能直接将内存回收啦如果有真正的高手能将以上出现的现象从内存管理机制解释一下,本人真是非常感谢啦
    哎,难道CSDN真的没有高手?
    哎,难道CSDN真的没有高手?
    哎,难道CSDN真的没有高手?
      

  14.   

    试一下 将DataTable Dispose 了
      

  15.   

    你可以试一下使用这样的函数public void Dispose()
    {
    /*对窗体控件进行  *.close(); 操作
    GC.SuppressFinalize(this);
    }这函数运行于你的Form2关闭的时候, 作用是要Form2不进入垃圾回收! 直接释放其空间! 希望能帮到你!
      

  16.   

    Ly_uu(Чu^宇^Kulu) :这个方法昨天试过,不行
      

  17.   

    对于非托管对象,关闭后对象一般需要经过两次垃圾收集后才能被释放.
    第一次收集后把对象放到终止列表中.
    第二次收集才会调用对象的Finalize() 释放内存.所以用下面的方法:GC.Collect();//强制对所有代进行垃圾回收
    GC.WaitForPendingFinalizers();//挂起当前线程,直到处理完成器队列的线程清空该队列为止。
    GC.Collect();//强制对所有代进行垃圾回收理论上用这种方法可以释放所有的垃圾
      

  18.   

    private void Form2_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    DataTable tbl = (DataTable)this.dataGrid1.DataSource;
    tbl.Dispose();
    tbl = null;
    this.Dispose();
    }Form1中调用Form2窗体的按钮事件:
    private void button1_Click(object sender, System.EventArgs e)
    {
    using (Form2 f = new Form2())
    {
    f.ShowDialog();
    f.Dispose();
    }
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    }
    没有任何反应,内存在Form2关闭后没有改变
      

  19.   

    http://dev.csdn.net/article/67/67891.shtm
      

  20.   

    http://www.microsoft.com/china/community/program/originalarticles/TechDoc/GCview.mspx
      

  21.   

    是的,.NET会在合适的时间回收内存,但并不是及时回收的。
      

  22.   

    如果对速度和资源有苛刻的要求,就不要用.Net了。
      

  23.   

    private void Form2_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    DataTable tbl = (DataTable)this.dataGrid1.DataSource;
    tbl.Dispose();
    tbl = null;
    this.Dispose();
    }Form1中调用Form2窗体的按钮事件:
    private void button1_Click(object sender, System.EventArgs e)
    {
    using (Form2 f = new Form2())
    {
    f.ShowDialog();
    f.Dispose();
    }
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    }
    没有任何反应,内存在Form2关闭后没有改变---------------------------------------------------你再打开form2,再关闭,再打开,再关闭,看是不是还是在不停增加?我虽然没试过,但是我估计最多打开2次后就不会再增加内存量了
      

  24.   

    这个问题值得讨论,.NET Remoting这个问题好像很严重!
      

  25.   

    可能是内存被垃圾回收后,只是被CLR标记为Free,并没有释放给操作系统 (这很容易理解,是为了提高效率)。为了验证这点,你可以试一下下面的代码ArrayList al = new ArrayList();
    for( int i=0; i< 1000; i++ )
     al.add( new Form2() );
    由于内存不被释放,内存占用量会直线上升。
    再试一下for( int i=0; i< 1000; i++ )
    {
    using (Form2 f = new Form2())
    {
    f.ShowDialog();
    f.Dispose();
    }GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    }内存上升到一个值后就不会再长了,因为回收后的内存会被不停的分配
      

  26.   

    我试过运行后FORM1后再点击按钮生成FORM2 但所占内存不变! 都是17M! 但是当我最小化它们两个后,在还原内存占用就只有3M 而且一直都是这样!
      

  27.   

    如果带dataset的话,先是释放它,然后From2.Dispose()
      

  28.   

    我也好想了解C#中的内存释放到底是怎么回事?关于内存的,我这还出现个新的问题
    我之前编过一个程序!不知道怎么回事,在运行编译的exe后,我关闭了exe程序.但其程序并没有彻底的关闭,而是存在系统的进程中.真不搞不懂了.到底是怎么了?在这也请各位指点下.