【问题标题】:Why does my simple wpf C# app with a DispatcherTimer appear to leak memory?为什么我的带有 DispatcherTimer 的简单 wpf C# 应用程序似乎会泄漏内存?
【发布时间】:2011-11-30 08:42:16
【问题描述】:

我创建了一个简单的 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();
        }
    }
}

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    这真的是内存泄漏,还是只是表面上的?

    只是外观。稳定增加是正常的,除非您运行足够长的时间使其崩溃,否则它不是泄漏。但这可能需要几天的时间,而且会有少量泄漏。

    您的内存使用量应该会趋于平稳,但要经过相当长的一段时间。您可以通过在此处使用 GC.Collect() 来加快速度(每 10 次左右)。

    对于严重的诊断,您需要一个内存分析器。

    例如:http://en.wikipedia.org/wiki/CLR_Profiler

    【讨论】:

    • CLR_Profiler 告诉我分配了 1.7M,任务管理器告诉我有 127M。你知道 CLR_Profiler 是否有能力将分配数据转储到文件中吗?
    【解决方案2】:

    我认为您的代码不会出现内存泄漏。内存增加只是因为没有实时调用 GC.Collect() 方法。 试试这个:

            void StaticTick(object o, EventArgs sender)
            {
                GC.Collect();
                memoryuseage.Text = GC.GetTotalMemory(true).ToString();
            }
    

    【讨论】:

    • 调用 GC.Collect() 几乎总是一个坏主意,而且它通常不会真正做到你认为的那样。例如:可能存在您没有意识到的引用,这意味着您最终会将对象提升到更高代,导致它们在内存中停留的时间更长。
    猜你喜欢
    • 2010-12-16
    • 2023-03-05
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多