动态控制内存泄漏

时间:2016-07-13 13:58:12

标签: c# .net winforms memory-leaks

我有一个Windows窗体应用程序。当我动态地向表单添加一些按钮,然后删除这些按钮时,就会出现内存泄漏。

public partial class Form1 : Form
{
    private Button[] buttons = new Button[1000];

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 1000; i++)
        {
            var b = new Button();
            Controls.Add(b);
            buttons[i] = b;
        }

        for (int i = 0; i < 1000; i++)
        {
            Controls.Remove(buttons[i]);
            buttons[i].Dispose();
            buttons[i] = null;
        }
    }
}

内存使用情况:

  • 表单加载后:3720 KB
  • 点击button1:5144 KB

(这些数字是在执行完全垃圾收集后记录的。程序在没有调试器的情况下运行,发布版本。)

更奇怪的是,无论button1_Click执行多少次,内存使用率都保持在5100 KB左右。我做错了什么?

1 个答案:

答案 0 :(得分:0)

这不是内存泄漏。首先,如果你依赖Windows任务管理器,这是不对的。如果您真的想测量应用程序的实际内存,请尝试使用一些性能计数器。或者甚至可能是这样的,

private Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;

其次,即使垃圾收集器收集堆中分配的对象,在它们被处理之后,这并不意味着应用程序将释放未分配的内存。只有在操作系统请求有线内存进行其他操作时才会发生这种情况。最重要的是,这不是内存泄漏。