【发布时间】:2013-01-10 14:03:24
【问题描述】:
我已经测试了以下代码。 单击按钮时,将创建对象并将它们添加到列表中。当另一个按钮被点击时,列表被清除
GC 正在销毁对象,但内存使用量并未减少。 为什么?有什么不对?
public partial class MainWindow : Window
{
public List<MyModel> MyList;
public MainWindow()
{
MyList = new List<MyModel>();
InitializeComponent();
}
private void button1_Click_1(object sender, RoutedEventArgs e)
{
MyList = new List<MyModel>();
for (int i = 0; i < 1000000; i++)
{
MyList.Add(new MyModel { ID = i, Description = "Model Id : " + i.ToString() });
}
MessageBox.Show("Complate!");
}
private void button1_Click_2(object sender, RoutedEventArgs e)
{
MyList.Clear();
MyList = null;
}
}
public class MyModel
{
~MyModel()
{
Console.WriteLine(Description);
}
public int ID { get; set; }
public string Description { get; set; }
}
【问题讨论】:
-
GC 不能保证立即释放内存。通常垃圾收集器在进行垃圾收集之前会等待一段时间,并且根据被释放对象的年龄,大约有三代 GC 在不同的时间发生。
-
您如何跟踪内存使用情况?您可能会发现这个问题的答案很有用 - stackoverflow.com/questions/6331389/…
-
即使 GC 决定收集您的对象,它也可能不会将内存释放回操作系统,并且使用外部工具(例如任务管理器)您可能看不到任何差异。
标签: c# .net memory-management garbage-collection