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