Восстановление от утечки памяти в WinForms
-
12-12-2019 - |
Вопрос
У меня есть приложение WinForms, которое полагается на несколько библиотек, над которыми у меня ограниченный контроль, такой как FORMS.IMAGES и FORMS.WEBBROWSER. Спорадические внезапные утечки памяти заставляют мою заявку с крахом. Это не чрезмерные утечки памяти, которые наращиваются. Они являются случайными, часто различными исключениями COM и невозможно предсказать - иногда они происходят через один час, иногда после дня.
Моя текущая методология, по крайней мере, временно справиться с проблемой, состоит в том, чтобы сделать другое приложение, проверьте, что первый работает с помощью GetProcessesByName (). Однако это проблематично, потому что текущий процесс иногда падает, но не закрывается. Я просто получаю сообщение WER (несмотря на то, что WER выключен на компьютер). Что хуже, в том, что когда первый процесс вылетает и утечка памяти накапливается, второе приложение для проверки процессов также сбивается. И тогда ничего не работает, пока я не перезагрузим весь шабанг.
1) Кто-нибудь знает эффективный способ выполнить процесс проверки, работает ли процесс B, не имея процесса, подверженного задачам памяти, которые сделали процесс B?
2) Если вышеизложенное невозможно, или слишком сложно, кто-нибудь знает какие-либо хорошие сторонние инструменты, которые могут быть использованы для обеспечения работы процессов без каких-либо непогашенных ошибок WER, которые перезагружают процессы, если обнаружены неисправности И это может выдерживать максимума ОЗУ?
Спасибо!
Решение
вместо того, чтобы пытаться обойти проблему, вы должны попытаться исправить его первым.
Если вы утечки памяти эксклонции при использовании неуправляемых ресурсов, я бы сказал, вместо того, чтобы игнорировать эти исключения, выбрасываемые вами, комфортные компоненты, уловить, затем утилизировать и повторно повторно использовать, если это невозможно, чтобы понять, что они вызывают.
рядом с этим, кажется, ваш процесс не врезался, а скорее не отзывчиво.См. Процесс. Соответствует .Или мониторируйте использование памяти и убить его, когда он превышает данный предел Process.workingset64
Другие советы
Обычно я бы использовал Pskill, чтобы убить процесс из командной строки.Не очень нужно написать .NET Service, чтобы сделать это.
Однако тот факт, что ваше предположительно небольшое и простое приложение для проверки процесса не заставило меня поверить, что есть что-то не так с актуальной системой.