Очистить мусорную память другого программного обеспечения в C#

Это странный вопрос. В своей работе я использую программное обеспечение (которое никто не может изменить или понять исходный код), это программное обеспечение, к сожалению, очень плохое. При запуске он использует около 1 ГБ ОЗУ, но работает и используется, он накапливает данные в ОЗУ и через несколько часов занимает более 4 ГБ ОЗУ и может накапливать все больше и больше, если его не остановить. Поскольку не все ПК моей компании могут с этим справиться, они терпят крах. Есть ли способ очистить данные, неиспользуемые в оперативной памяти, от другого программного обеспечения на C#? Мне просто нужна подсказка, я программирую на C#. Я извиняюсь за мой английский, и если этот вопрос как-то не так. Спасибо за время.

Изменить: я добавлю некоторую информацию об этом программном обеспечении лучше понять, что я могу сделать, а что нет. Поскольку я не получу ничего взломав это программное обеспечение, но у меня будет лучшая жизнь (и не только я, но и мои коллеги и сотрудники), я не вижу никаких проблем во взломе этого программного обеспечения. (ну, у моего начальника нет проблем, и у его начальника тоже). Я попробую подсказку Arunasr, я программирую на C# и знаю эту функцию. Я только должен декомпилировать это. Я должен удалить этот вопрос? Спасибо за все ответы и всю помощь, которую вы мне оказали.

2 ответа

Нет такого способа, кроме как убить и перезапустить эту задачу. Если это служба Windows, вы можете использовать Powershell, утилиту командной строки SC.exe или этот код C#:

public static void RestartService(string serviceName, int timeoutMilliseconds)
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    int millisec1 = Environment.TickCount;
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Stop();
    service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

    // count the rest of the timeout
    int millisec2 = Environment.TickCount;
    timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2-millisec1));

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
  }
  catch
  {
    // ...
  }
}

Ссылка: http://www.csharp-examples.net/restart-windows-service/

Сборщик мусора во время выполнения.NET имеет тенденцию быть ленивым и собирать только тогда, когда заканчивается свободная память. Вы можете форсировать сборку мусора с помощью GC.Collect(), но помните о производительности: это дорого, если вы делаете это часто.

Если библиотека действительно накапливает данные (т.е. данные остаются ссылками, а GC не может их коснуться), мало что можно сделать, кроме как взломать библиотеку, выяснить, что израсходует память, и освободить ненужные объекты. Нетрудно декомпилировать байт-код.NET. В крайнем случае вы можете изменить байт-код сборки, используя отражение после его загрузки. Я бы не советовал, если вы не в отчаянии.

Вы можете использовать GC для отслеживания реальной статистики использования памяти.

Другие вопросы по тегам