资源泄漏的后果是什么?

What are the consequences for leaking resources?

很明显,我们应该按照原则清理自己。 Windows 2000 年之前的我们这些人都知道内存泄漏给用户带来的痛苦。但是我很好奇将句柄泄漏到其他系统资源可能会造成什么后果。

这可能是未关闭的文件或数据库连接。在 .net 中任何可以 IDisposable 的东西。我们是 Windows 商店,但我也对其他操作系统感兴趣。

我可以用什么论据让团队成员更认真地对待这个问题,或者在现代系统上还有更大的鱼要炸?

这真的取决于资源是什么。

有些资源几乎只影响你自己的进程。打开的文件句柄在您的进程中受到限制,但您不会因泄露它们而对整个系统产生太大影响。如果您有 运行 长的进程(例如服务器或 GUI 应用程序),清理它们很重要,但对于 运行 一次的作业,它并不那么重要。当您的进程关闭时,这些资源无论如何都会被清理。

一些资源会影响其他进程。数据库通常具有非常低的连接限制(有时是由于许可限制)。如果您在完成连接后没有正确关闭连接,您将运行很快。此外,打开的连接会耗尽数据库服务器的资源,因此可能会降低所有用户的速度。此外,这些资源也可能不会在进程关闭时被回收,因为 OS 不知道它们;相反,连接最终可能会在服务器上超时,但这可能比您的进程要长得多 运行ning.

与其将资源视为 "things" 是 "released",不如将获取 IDisposable 对象视为要履行的责任。许多 IDisposable 对象要求外部实体代表他们做事,直到他们通知这些实体不再需要他们的服务;这样一来,他们就有责任确保这些外部实体确实收到了此类通知。当在 IDisposable 上调用 Dispose 时,它可以履行其职责,通知它一直在使用其服务的任何对象不再需要这些服务。

如果系统注意到对象已被遗弃,则对象可以请求通知。收到此类通知的对象通常可以假定不再需要他们的服务,并通知任何其服务已被使用的人。这种机制在某些情况下可以正常工作,但不应被认为是可靠的,因为多种因素可能会阻止系统注意到对象已被有效放弃。

至于调用 Dispose 失败的后果,很简单:由于不再需要对象的服务而应该发生的事情不会发生。如果一个对象应该通知其他对象或实体不再需要它们的服务,而它们又应该通知其他对象或实体,那么 none 这些通知将会发生。

除非在少数情况下代码将在程序的生命周期内使用托管资源,并且可以依赖 OS 将程序终止识别为程序不再存在的指示需要它的服务,通常调用 Dispose 不再需要的东西会更容易,不管它们是否真的 "care",而不是试图确定主要问题是由导致实体无法通知所有关心他们的服务不再需要的人。