Winforms winform应用程序内存泄漏的常见问题有哪些?

Winforms winform应用程序内存泄漏的常见问题有哪些?,winforms,memory-leaks,memory-profiling,Winforms,Memory Leaks,Memory Profiling,我试着用蚂蚁记忆分析器来理解。我的问题是,我没有一个容易的应用程序有内存泄漏 我使用了Redgate(QueryBee)的样品,但它是为我的口味而设计的。必须有一个更简单的应用程序 我试着编一个,但它不起作用。它不工作意味着:我没有内存泄漏。我读到关于调用ShowDialog而不处理调用的表单会导致内存泄漏的消息,但这里的情况并非如此 我使用VS2010和.NET4.0 我对非常普遍的问题特别感兴趣 这是我到目前为止的资料。你能帮我查一下内存泄漏吗 主要形式 using System; usin

我试着用蚂蚁记忆分析器来理解。我的问题是,我没有一个容易的应用程序有内存泄漏

我使用了Redgate(QueryBee)的样品,但它是为我的口味而设计的。必须有一个更简单的应用程序

我试着编一个,但它不起作用。它不工作意味着:我没有内存泄漏。我读到关于调用ShowDialog而不处理调用的表单会导致内存泄漏的消息,但这里的情况并非如此

我使用VS2010和.NET4.0

我对非常普遍的问题特别感兴趣

这是我到目前为止的资料。你能帮我查一下内存泄漏吗

主要形式

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MemoryLeakTest
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SubForm formToCall = new SubForm();
            formToCall.ShowDialog();
        }
    }
}
子窗体

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace MemoryLeakTest
{
    public partial class SubForm : Form
    {


        public SubForm()
        {
            InitializeComponent();
        }

        private void SubForm_Load(object sender, EventArgs e)
        {

            ArrayList persons = new ArrayList();

            for (int i = 0; i <= 50000; i++)
            {
                var person = new {
                    Name = "1 SchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorsch",
                    LastName = "KluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluni", 
                    Age = 50,
                    City = "LondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondon",
                    Zip = "223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301", 
                    Index = i 

                };
                persons.Add(person);
            }

            dataGridView1.DataSource = persons;
        }

        private void SubForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            //this.Dispose();
        }


    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用系统集合;
名称空间内存测试
{
公共部分类子窗体:窗体
{
公共子窗体()
{
初始化组件();
}
私有无效子窗体\u加载(对象发送方,事件参数e)
{
ArrayList persons=新建ArrayList();

对于(int i=0;i将其添加到子窗体

public void mouse_handler(object sender, MouseEventArgs e)
{

}
并更改主窗体以执行此操作

private void button1_Click(object sender, EventArgs e)
{
     SubForm formToCall = new SubForm();
     this.MouseClick += new MouseEventHandler(formToCall.mouse_handler);
     formToCall.ShowDialog();
}
现在不管你是否.Dispose()子窗体,你仍然会有一个“漏洞”。你的MainForm通过它的鼠标事件处理程序无限期地保留对子窗体的引用,它基本上只是接收事件的人的列表,因为该处理程序从未被注销


Ants将帮助您跟踪这一点,但它会手动显示对象仍处于活动状态并从根目录引用,并且您必须发现这些对象不应在任何地方引用。我相信Ants在发现已被.Disposed()处理的对象时也会生成警告/等,但仍在某处引用。

不要使用.NET创建内存泄漏?此.Controls.Clear()是一种非常有效的永久泄漏大量内存的方法。这是一种很好的方法。在ant profiler中,我看到有很多字符串实例不能是gc。我可以点击它,看到它们中的大多数都不是gc,因为它们仍然有对MouseEventHandler的引用。你应该也能够找到子窗体,因为它永远不会是gc现在GC'ed了,子窗体基本上是保持persons ArrayList中的字符串处于活动状态的根。是的,子窗体也在显示引用的图形中