Утечка памяти в цикле - PullRequest
       2

Утечка памяти в цикле

2 голосов
/ 28 января 2012

Я выполняю некоторый код в цикле while, чтобы программа всегда работала. Если программа не запущена, она запускает ее, если ее нет, она копирует ее из резервной копии и затем запускает, ничего сложного:

while (true)
{
    Process backup = new Process();
    ProcessStartInfo check = new ProcessStartInfo(file);
    if (Process.GetProcessesByName(file).Length == 0)
    {
        if(File.Exists(file))
        {
            backup.StartInfo = check;
            backup.Start();
        }
        else if (!File.Exists(file))
        {
            File.Copy(backupFile, file);
            Thread.Sleep(250);
            backup.StartInfo = check;
            backup.Start();
        }
    }
    backup.Close();
    Thread.Sleep(2000);
}

Проблема в том, что после каждого цикла использование оперативной памяти возрастает примерно на 100 КБ, что не так много, я знаю, но если оно будет работать в течение часа или около того, это вызовет большие проблемы.

Я пытался приостановить его и использовать .Close() в процессе, но без радости. Любые идеи очень ценятся.

Ответы [ 5 ]

10 голосов
/ 28 января 2012
  1. Поместите эти строки внутри оператора if, чтобы они не выполнялись, если процесс не запущен:

    Process backup = new Process();
    ProcessStartInfo check = new ProcessStartInfo(file);
    
  2. Поскольку Process реализует IDisposable, вы можете заключить его в оператор использования, как предложил Одед.

  3. У вас нет фактической утечки памяти.Когда сборщик мусора запустится, память будет восстановлена.Если использование временной памяти является проблемой, вы можете принудительно запустить GC, но я думаю, что после выполнения # 1 у вас также не будет проблем с использованием временной памяти.

0 голосов
/ 30 января 2013

Смотри! Я только что проверил все эти опции, но ничего.С другой стороны, я решил твою проблему.Создайте новый поток, установите его ApartmentState = STA, затем поместите код, который у вас есть, в то время, чтобы он выполнялся в этом новом потоке.Используя это, вы будете уверены, что все ресурсы будут освобождены после уничтожения потока.Я проверил, все работает!

0 голосов
/ 29 января 2013

У меня была такая же проблема, поэтому я использовал это:

[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

[DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern IntPtr GetCurrentProcess();

Вызовите эти методы, и память освободится.

0 голосов
/ 28 января 2012

Как говорится, у вас нет утечки памяти (по крайней мере, так не кажется).

Но то, что вы можете сделать, это разместить инициализацию в другом месте, вы часто инициализируете резервное копирование и проверяете, когда вам это не нужно.

while (true)
{
    Process backup;
    ProcessStartInfo check;
    if (Process.GetProcessesByName(file).Length == 0)
    {
        check = new ProcessStartInfo(file);//moved init
        backup = new Process();//moved init
        if(File.Exists(file))
        {
            backup.StartInfo = check;
            backup.Start();
        }
        else if (!File.Exists(file))
        {
            File.Copy(backupFile, file);
            Thread.Sleep(250);
            backup.StartInfo = check;
            backup.Start();
        }
    }
    backup.Close();
    Thread.Sleep(2000);
}
0 голосов
/ 28 января 2012

В опубликованном вами коде нет утечки памяти.

Вы можете попробовать вызывать сборщик мусора самостоятельно каждые X итераций, используя

System.GC.Collect();

Обратите внимание, что это, как правило, считается плохим дизайном, поэтому его следует использовать только в том случае, если вам абсолютно необходимо контролировать объем используемой оперативной памяти. В любом случае C # не может быть предпочтительным языком, если у вас есть такие жесткие требования к ресурсам.

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