我首先定义了一个类,这个类申请了100M的空间
class TestClass
{
public byte[] abc = new byte[1024 * 1024 * 100]; public TestClass()
{
} public void Test()
{
abc = new byte[1024 * 1024 * 100];
GC.Collect();
}
}然后我创建了两个窗体,每当点击创建新窗体时,就调用该类
private TestClass tc = new TestClass();
private void Form2_Load(object sender, EventArgs e)
{
tc.Test();
}不停的关闭打开第二个窗口,每次内存都增加100M,而且没有减少,我在关闭窗口之后,调用了Dispose来销毁这个窗口,但是tc这个对象好像一直没有销毁,不知道tc应该在什么时候销毁,还是需要手动销毁该对象?

解决方案 »

  1.   

    会不会和PUBLIC类型有关哪,用完后把ABC赋成NULL可以么?
      

  2.   

    BUG?你回收下好了
    GC.Collect();
      

  3.   

    public void Test()
    {
       abc = new byte[1024 * 1024 * 100];
       //GC.Collect();
    }不用回收,也不会一直上升,只占用200M,不会更多.
    系统自动做了回收
      

  4.   

    hchack你的问题真不错,值得学习C#的人思考。我们很多人都以为.NET会自动释放资源了,所以都不闻不问这中间的过程,导致了内存使用过高,对于大内存配置问题不大,遇到小内存的老机器,就怨声载道了。对于你的GC.Collect(); 调用,个人感觉是放错地方了,GC的垃圾回收只有在你释放了对象的所有引用才能有效,也就是你必须在GC.Collect()之前,先abc =null;
    如果你不打算在那个类里释放,而是在类的外部调用GC.Collect() 的话,你也要在tc=null之后调用才有效。如果你不主动调用GC.Collect(); 来释放内存的话,很可能会出现你那种情况,内存不断增长。不过那不代表不能被回收了,之后你随时可以通过两次调用GC.Collect() 来释放增长的大量内存使用。为什么要调用两次GC.Collect() 呢,因为当第一次调用后,回收了Form2占用的资源,使得Form2内部的tc不可到达了,第二次才真正回收了tc占用的资源。
      

  5.   

    不是.NET的bug,是楼主对内存管理不够熟悉。请参考:
    GC,通往自由的大道
    http://blog.csdn.net/gisfarmer/archive/2009/02/24/3932444.aspx和另外一个CSDN GC讨论贴http://topic.csdn.net/u/20090303/22/3e989573-7dae-4689-9bf2-d0deae2d263e.html
      

  6.   


    说的很有道理,是我自己的问题,如果将tc=null,那么这块的内存就会回收回去,内存就不会在增长了,谢谢!