【发布时间】:2015-07-26 20:30:47
【问题描述】:
我一直在尝试了解进程内存的工作原理。所以我尝试了以下一段代码
public void OpenFormWithoutList()
{
Form2 form = null;
int index = 0;
while (index < 5000)
{
form = new Form2();
form.ShowDialog();
index++;
}
}
public void OpenFormWithList()
{
Form2 form = null;
List<Form> list = new List<Form>();
int index = 0;
while (index < 5000)
{
form = new Form2();
list.Add(form);
form.ShowDialog();
index++;
}
list = null;
}
在 Form2.cs 中,我在 OnLoad 事件中关闭了表单,因此控件应该再次返回到父表单 (Form1)。
当我从一开始分别运行这两个方法时,以下是方法执行后的观察:
开始:20 MB OpenFormWithList(): 29MB
开始:20MB OpenFormWithoutList(): 25MB
当调用 OpenFormWithoutList() 时,GC 正在收集表单,因此内存使用量不会达到 29MB。但是一旦这些方法结束,那么内存使用也不会回到开始阶段,即 20MB。
那么为什么内存没有被清除,究竟是什么在消耗内存?
【问题讨论】:
-
旁注:
list = null;充其量是多余的。 GC 和 JIT 协作以了解变量的生命周期。他们已经知道,在方法结束时,list变量不再是“活动”引用,并且不能使用该变量来保持被引用对象的活动状态。 -
请记住,每个表单所需的资源句柄数量有限。它可能会使您的测试复杂化。最好避免使用任何形式的 UI 进行内存测试。
标签: c# .net memory-management garbage-collection visual-studio-2015