Почему мое простое приложение wpf C # с DispatcherTimer, похоже, пропускает память? - PullRequest
3 голосов
/ 30 ноября 2011

Я создал простой 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();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Не думаю, что в ваших кодах будет утечка памяти.Память увеличивается только потому, что метод GC.Collect () не вызывается в реальном времени.попробуйте это:

        void StaticTick(object o, EventArgs sender)
        {
            GC.Collect();
            memoryuseage.Text = GC.GetTotalMemory(true).ToString();
        }
1 голос
/ 30 ноября 2011

Это действительно утечка памяти или просто ее появление?

Только внешний вид.Постоянный рост - это нормально, это не утечка, пока вы не можете его сломать, запустив его достаточно долго.Но это может занять несколько дней с небольшой утечкой.

Использование вашей памяти должно выравниваться, но только через значительное время.Вы могли бы ускорить это, используя здесь GC.Collect () (каждый десятый тик или около того).

Для серьезного диагноза вам потребуется профилировщик памяти.

Например: http://en.wikipedia.org/wiki/CLR_Profiler

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...