Восстановление после утечки памяти в WinForms - PullRequest
0 голосов
/ 12 марта 2012

У меня есть приложение WinForms, которое опирается на несколько библиотек, над которыми у меня ограниченный контроль, таких как Forms.Images и Forms.WebBrowser. Внезапные утечки памяти вызывают сбой моего приложения. Это не утечки памяти со временем, которые накапливаются. Они случайные, часто разные исключения COM и их невозможно предсказать - иногда они происходят через час, иногда через день.

Моя текущая методология, чтобы хотя бы временно справиться с этой проблемой, состоит в том, чтобы другое приложение проверило, что первое запущено, с помощью GetProcessesByName (). Однако это проблематично, поскольку текущий процесс иногда завершается сбоем, но не закрывается. Я просто получаю сообщение WER (несмотря на то, что WER выключен на компьютере). Хуже всего то, что, когда происходит сбой первого процесса и происходит утечка памяти, также происходит сбой второго приложения для проверки процессов. И тогда ничего не работает, пока я вручную не перезагружаю весь шабан.

1) Кто-нибудь знает эффективный способ проверки процесса A, если процесс B запущен, не подвергая процесс A проблемам с памятью, которые привели к сбою процесса B?

2) Если вышесказанное невозможно или слишком сложно, кто-нибудь знает какие-либо хорошие сторонние инструменты, которые можно использовать для гарантии того, что процессы работают без каких-либо выдающихся ошибок WER, которые перезапускают процессы, если обнаружены ошибки WER, и что может выдержать израсходованный ОЗУ?

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Вместо того, чтобы пытаться обойти проблему, вы должны сначала попытаться ее исправить.

Если вы испытываете утечки памяти при использовании неуправляемых ресурсов, я бы сказал, что вместо игнорирования тех исключений, которые вызываются вашими компонентами com, перехватывайте, а затем утилизируйте и повторно инициализируйте, если невозможно определить, что их вызывает.

Кроме того, кажется, что ваш процесс не аварийно завершился, а скорее не отвечает. См. Process.Responding . Или отслеживать использование памяти и уничтожать ее, когда она превышает заданный предел Process.WorkingSet64

0 голосов
/ 12 марта 2012

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

однако тот факт, что ваше, по-видимому, маленькое и простое приложение для проверки процессов переходит на другой ресурс, заставляет меня поверить, что с данной системой что-то не так.

pslist & pskll

...