【发布时间】:2011-03-09 04:38:23
【问题描述】:
我有一个 24x7 运行的 Windows 服务,内存使用量稳步攀升,大约每周一次,我们必须重新启动它。
我正在寻找有关了解 .NET 中的内存使用情况的信息,以便我可以清楚地了解我们的服务为什么会这样做。
我还想在 .NET 中更好地理解这一点。
谁有好的链接?
谢谢
【问题讨论】:
-
不是你所追求的,但为了解决这个特定问题,我会寻找实现 IDisposable 的 .NET 对象,但你不会处理这些对象。这通常是数据库连接、对非托管代码的调用,以及运行时无法完全识别的任何事情,只要它真正“完成”。
-
@Harper 不确定这会造成泄漏——GC 最终会清理它——除非持有引用。 IDispose 接口和后续模式的好处是您可以确定地释放非托管资源或关闭连接;如果不以这种方式处理它们,GC 仍应作为最后的手段。
-
@Harper,我必须同意亚当的观点。通常,当您不对一次性对象调用
Dispose()时,您看到的是锁定文件、无法打开更多数据库连接等。由于内存使用量增长如此缓慢,因此 GC 不太可能没有足够“早”地运行以运行终结器并释放非托管资源。 -
也许我说的没有我想的那么多。我真正的怀疑是,在某个地方,有一个长期存在的对象持有对这些事物中的一个或多个的引用。当然,其他非 IDisposable 实现对象也可能是这种情况。我通常只是从那里开始,因为这些东西你会坚持很长时间,特别是如果它们的创建成本很高。