伙计我在C#中有一个简单的Windows窗体应用程序。它只有2个表格。一个表单只有一个按钮,而另一个表单有DataGridView
和一个按钮。请查看两种表格的代码:
代码Form1
,有一个显示Form2
的按钮。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void showFrom2_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show();
}
}
Form2
代码,其中DataGridView
由GUID填充,一次测试10k行。
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void populateGrid_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
for (int i = 0; i < 10; i++)
{
dt.Columns.Add(i.ToString());
}
for (int j = 0; j < 10000; j++)
{
DataRow row = dt.NewRow();
for (int k = 0; k < 10; k++)
{
row[k] = Guid.NewGuid().ToString();
}
dt.Rows.Add(row);
}
dataGridView1.DataSource = dt;
}
private void closeForm2_Click(object sender, EventArgs e)
{
dataGridView1.Dispose();
this.Close();
}
现在每当我填充DataGridView
然后关闭Form2
。内存未释放。如果我继续填充网格并关闭Form2
&#34; MULTIPLE&#34;没有关闭整个应用程序的时间,我的系统内存不足(我有1 GB的RAM)。打电话给dataGridView1.Dispose();
时,不应该GarbageCollector
完成他的工作并释放记忆吗?
我想要的是每当我关闭Form2
时,应该在系统中释放内存。
注意:我正在通过TaskManager
监控内存(我知道它并没有显示正确的内存消耗量,但是如果我保留内存不足则无关紧要填充网格。内存未被释放)。我甚至试图在关闭按钮上拨打GC.Collect()
(这不是一个好的电话,也没有任何帮助)。
另外,如果有人能告诉我如何监控&#34;真实的&#34;我会很感激。应用消费。我在某处读到了你使用.Net性能计数器。那是什么?
P.S。不要问为什么我用10k行填充网格。我只是为测试目的而做。
答案 0 :(得分:1)
不要永远打电话给GC.Collect()
。
一旦应用程序即将达到RAM限制,GC将自动调用,但如果您的应用程序需要更多系统可访问的RAM,则会出现OutOfMemory异常。
答案 1 :(得分:-1)
调用dataGridView1.Dispose();不应该GarbageCollector做他的工作,并释放 存储器?
不,一个人与另一个人无关。
我甚至试图在关闭按钮上调用GC.Collect()(这不是一个好的调用它 也没有帮助。
这是一个愚蠢的呼唤,而不是一个好的呼叫 - 它完全掩盖了GC的统计数据,绝不应该在非常具体的问题和调试之外调用。
抓住内存分析器并找出原因。内存分析器将允许您查看哪些引用使对象保持活动状态,以及实际使用内存的内容。我有点打赌它不是你的想法 - 而且错误要么根本不是你的想法,要么至少与你所展示的代码无关。
保持内存存活的表单中的一般罪魁祸首是错过引用和事件(因为事件意味着调用者必须有一个指向被调用对象的指针)。
你展示的代码很好。
如果您在获取memoryprofiler时遇到问题 - 我更喜欢memprofiler(http://memprofiler.com/) - 没有关联,只是满意的用户。他们有7天免费试用。