我最近创建了一个新的WPF应用程序,该应用程序在MainWindow.xaml中具有一个循环,该循环创建另一个页面(Test.xaml)的新对象并创建Test.xaml页面的对话框。在Test.xaml中,我添加了一个Textblock并在Loaded事件上更新了Text属性,并立即关闭了页面。
现在,当我运行代码时,我看到此应用程序使用的内存在不断增加。为什么这真的发生了?
我已经在处理先前的对象并用新的对象重写,但由于先前的对象,它仍在增加内存。
其背后的原因可能是什么?我该如何消除这种行为?
我尝试创建应用程序的内存转储以分析内存泄漏,在那里我看到Hashtable,DependencyProperty和EventHandler正在使用大部分内存。
MainWindow.xaml
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
int counter = 0;
Test test = null;
do
{
test = null;
test = new Test();
test.ShowDialog();
} while (++counter != 5000);
test = null;
}
Test.xaml
private void Test_Loaded(object sender, RoutedEventArgs e)
{
MyTextBox.Text = "Testing leaks";
Close();
}
我的期望是该对象应该被完全丢弃,并且不应该增加内存。
答案 0 :(得分:2)
.NET使用的垃圾收集器有时会运行一次。将对象设置为null
时,实际上仅删除了对该对象的引用,因此可以在下一次垃圾回收期间对其进行收集。因为您的程序不需要太多分配,并且没有内存压力,所以我认为垃圾收集器不会运行。
通常不需要将变量重置为null
,因为当变量超出范围时,引用也会丢失。您可能需要尝试一下JetBrains DotMemory,然后您会发现该应用程序在初始加载后将具有相对恒定的内存使用率。
不要在代码中插入GC.Collect()
,因为垃圾收集器通常具有良好的启发式功能,可以知道何时需要调用它。