Очистить мусорную память другого программного обеспечения в 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 для отслеживания реальной статистики использования памяти.