【问题标题】:Understanding Memory Usage了解内存使用情况
【发布时间】:2011-03-09 04:38:23
【问题描述】:

我有一个 24x7 运行的 Windows 服务,内存使用量稳步攀升,大约每周一次,我们必须重新启动它。

我正在寻找有关了解 .NET 中的内存使用情况的信息,以便我可以清楚地了解我们的服务为什么会这样做。

我还想在 .NET 中更好地理解这一点。

谁有好的链接?

谢谢

【问题讨论】:

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

标签: .net memory


【解决方案1】:

我没有任何链接,但听起来您在某处有内存泄漏 - 尽管我正在努力了解如何每周专门介绍这一点。您的服务是否在代码中注册事件?这些通常是内存泄漏问题(注册事件的对象已完成,但处理程序未注册,这意味着存在实时引用,因此该对象不能是垃圾收集)。

Unregistered event handlers cause memory leak

【讨论】:

    【解决方案2】:

    嗯,这有点简单:GC 不时运行并删除死对象。当没有活动引用指向一个对象时,它被认为是死的。生命引用是通过从根开始(例如静态变量、CPU 寄存器等)并遍历所有对象来确定的。 this 未到达的所有对象都已死亡。

    因此,为了解决您的问题,您应该使用内存分析器并检查哪些对象保留在内存中,例如由于拥有一个“缓存”值的静态字典等等。

    【讨论】:

      【解决方案3】:

      您所看到的称为Memory Leak。网上有很多可用的资源。我不确定这是一个有效的问题,除非您想提供一些代码供我们识别泄漏。

      【讨论】:

        【解决方案4】:
        猜你喜欢
        • 2019-04-18
        • 1970-01-01
        • 2018-10-11
        • 2012-09-04
        • 1970-01-01
        • 2015-01-13
        • 2020-12-10
        • 2016-07-25
        • 1970-01-01
        相关资源
        最近更新 更多