我创建了一个带有单个文本框的简单wpf C#和DispatcherTimer,它每秒显示对GC.GetTotalMemory(true)的调用结果。每次调用返回的值都会稳定增加,任务管理器会显示私有工作内存集也会增加。 这真的是内存泄漏,还是只是一个外观?在我真实的应用程序中,每个滴答内容都会发生很多事情,内存泄漏显得更高。 我的代码如下
XAML
<Window x:Class="TestWPFApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<TextBox Name="memoryuseage"></TextBox>
</Grid>
</Window>
xaml.cs
namespace TestWPFApplication
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
System.Windows.Threading.DispatcherTimer tmr;
public Window1()
{
InitializeComponent();
tmr = new System.Windows.Threading.DispatcherTimer();
tmr.Interval = new System.TimeSpan(0, 0, 1);
tmr.Tick += new EventHandler(StaticTick);
tmr.Start();
}
void StaticTick(object o, EventArgs sender)
{
memoryuseage.Text = GC.GetTotalMemory(true).ToString();
}
}
}
答案 0 :(得分:1)
这真的是内存泄漏,还是只是一个外观?
只是外观。稳定的增加是正常的,它不是泄漏,直到你可以通过运行它足够长时间崩溃它。但这可能需要几天时间才会发生小泄漏。
你的内存使用量应该保持平稳,但只是在相当长的一段时间之后。你可以通过在这里使用GC.Collect()(每10个左右)来加快速度。
对于严重的诊断,您需要一个内存分析器。
答案 1 :(得分:1)
我认为代码中不会有内存泄漏。内存增加只是因为GC.Collect()方法没有实时调用。 试试这个:
void StaticTick(object o, EventArgs sender)
{
GC.Collect();
memoryuseage.Text = GC.GetTotalMemory(true).ToString();
}