Простое приложение с таймером пожирает память? - PullRequest
5 голосов
/ 04 августа 2010

Кто-нибудь может объяснить, почему использование памяти этого крошечного приложения продолжает расти?

static class Program
{
    private static System.Timers.Timer _TestTimer;

    [STAThread]
    static void Main()
    {
        _TestTimer = new System.Timers.Timer();
        _TestTimer.Interval = 30;
        _TestTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TestTimer_Elapsed);
        _TestTimer.Enabled = true;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    static void _TestTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        string test = "tick";
        Trace.WriteLine(test);
        test = null;
    }
}

Спасибо! Pika81

Ответы [ 4 ]

3 голосов
/ 04 августа 2010

Вы предполагаете, что использование памяти не должно увеличиваться. Неправильное предположение, это просто , а не , как работает сборщик мусора .NET или менеджер кучи Windows. Оба они работают эффективно, используя доступную для использования память вместо постоянного освобождения и перераспределения памяти.

Дайте ему поработать неделю. Может быть быстрее, если вы сделаете интервал меньше. Также минимизируйте форму для впечатляющих эффектов.

1 голос
/ 04 августа 2010

Если вы только просматриваете диспетчер задач, чтобы увидеть, сколько памяти использует ваш процесс, вы, вероятно, не получите очень точные показания.1004 *

Это объясняет некоторые недостатки использования TaskManager в качестве средства измерения использования памяти приложением .Net.

1 голос
/ 04 августа 2010

Мое предложение было бы включить Windbg и выяснить, какие объекты существуют в памяти.
Согласились, что разработчики обычно используют его как последний вариант, но в этом случае это даст вам точную причину увеличения памяти

1 голос
/ 04 августа 2010

Я копался в источнике DefaultTraceListener и нашел это:

private void WriteLine(string message, bool useLogFile)
{
    if (base.NeedIndent)
    {
        this.WriteIndent();
    }
    this.Write(message + "\r\n", useLogFile);
    base.NeedIndent = true;
}

Таким образом, использование памяти, вероятно, растет слишком медленно, чтобы сборщик мусора немедленно отреагировал.

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