从WinForms中的内存泄漏崩溃中恢复

本文关键字:崩溃 恢复 泄漏 WinForms 内存 | 更新日期: 2023-09-27 18:27:42

我有一个WinForms应用程序,它依赖于几个我控制有限的库,如Forms.Images和Forms.WebBrowser。偶尔突然的内存泄漏会导致我的应用程序崩溃。这些并不是随着时间的推移而积累起来的内存泄漏。它们是随机的,通常是不同的COM异常,无法预测——有时发生在一小时后,有时发生在天后。

我目前至少暂时解决这个问题的方法是让另一个应用程序通过使用GetProcessesByName()来验证第一个应用程序是否正在运行。然而,这是有问题的,因为正在进行的过程有时会崩溃,但不会关闭。我刚刚收到一条WER消息(尽管电脑上的WER已经关闭)。更糟糕的是,当第一个进程崩溃,内存泄漏增加时,第二个进程检查应用程序也会崩溃。然后什么都不起作用,直到我手动重新启动整个沙邦。

1) 有人知道让进程A检查进程B是否在运行而不让进程A受到导致进程B崩溃的内存问题的有效方法吗?

2) 如果以上不可能,或者太难了,有人知道有什么好的第三方工具可以用来确保进程在运行时没有任何未解决的WER错误,如果检测到WER故障,可以重新启动进程,并且可以承受最大的RAM吗?

谢谢!

从WinForms中的内存泄漏崩溃中恢复

与其试图解决这个问题,不如先尝试解决它。

如果您在使用非托管资源时预计会发生内存泄漏,我想说,与其忽略com组件引发的异常,不如捕获,然后处理,如果无法确定是什么原因导致的,则重新初始化。

除此之外,您的流程似乎没有崩溃,而是不再有响应。请参阅Process.Responding。或者监视内存使用情况,并在超过给定限制时终止它Process.WorkingSet64

通常我会使用pskill从命令行终止进程。不需要写一个.net服务就可以了。

然而,事实上,你的小而简单的流程检查应用程序正在故障,这会让我相信实际的系统有问题。

pslist&pskll