内存泄漏和处置(Memory leaks and dispose)

2019-09-22 13:44发布

可我不明白conecept还是我做错事的时候。 我对.NET中的内存管理的一些问题。

想象一下这种情况:

Form1是大块头形式,如MDI父和一点点FormChild ,势必为孩子:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            FormChild formChild = new FormChild();

            formChild.MdiParent = this;
            formChild.Show();

        }
    }

现在孩子被分配一点点内存为模拟:

public partial class FormChild : Form
{
    private readonly List<byte[]> _list = new List<byte[]>();

    public FormChild()
    {
        InitializeComponent();


    }

    private void FormChild_Load(object sender, EventArgs e)
    {
        int i = 0;
        while (i < 100)
        {
            _list.Add(new byte[1024 * 1024 * 10]);
            i += 1;
        }

    }

}

现在,我正与一个内存分析器检查什么的内存堆回事。 我明白了,如果我点击按钮,分配内存。 然后我关闭FormChild和它调用Dispose() 。 但记忆仍被分配。 如果我再次点击System.OutOfMemoryException occures。

为什么GC等待释放托管内存? 或者,这是我设计的错误呢?

Answer 1:

它看起来像某种时机的问题,其中formChild的第一个实例仍然可以连接(即不是垃圾)文的第二个被创建。 你不能容纳_list两次。

请注意, 我关闭FormChild,它调用Dispose()是一个声明关于资源和窗户把手,不是释放内存。

如果你写你自己的Dispose(),但你应该这样(比较特殊)情况目前尚不清楚。

  • void Dispose(bool disposing)从方法FormChild.Designer.cs文件并将其移动到FormChild.cs

  • 用它来释放巨大的内存块:

     protected override void Dispose(bool disposing) { _list = null; // add this if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } 

请注意,这不是内存管理的一个“平常”的形式,但它是必要的,因为你的_list是不寻常了。



Answer 2:

该GC仅在响应内存压力释放内存,配置的主要目的是清理非内存相关的资源。

换句话说归零了管理的对象是不是一定要去让他们得到任何收集快,但使诊断内存问题更容易诊断。



Answer 3:

您可以为垃圾回收使用GC.Collect的立即执行( http://msdn.microsoft.com/en-us/library/xe0c2357.aspx )

不过,我通常让它处理本身并实现Dispose方法。



Answer 4:

重写DisposeFormChild ,所以你可以清理你的资源。

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        if (_list != null)
        {
            // Clear it, dispose it, do whatever you want with it.
        }
    }

    base.Dispose(disposing);
}

作为Yaur说,GC不会立即清理内存时Dispose被调用,但它是清理一下就可以很好的做法。



文章来源: Memory leaks and dispose