.net 了解内存使用情况

.net 了解内存使用情况,.net,memory,.net,Memory,我有一个全天候运行的windows服务,内存使用率稳步攀升,大约每周我们必须重新启动一次 我正在寻找有关了解.NET中内存使用情况的信息,以便能够清楚地了解我们的服务为什么要这样做 我还想在.NET中进一步了解这一点 有人有好的链接吗 谢谢我没有任何链接,但听起来好像你在某处有内存泄漏-尽管我很难确定如何每周专门介绍一次。您的服务是否以代码注册事件?这些经常是gotcha内存泄漏(注册事件的对象已完成,但处理程序未注册,这意味着存在活动引用,因此无法对对象进行垃圾收集) 你所看到的被称为。网上有

我有一个全天候运行的windows服务,内存使用率稳步攀升,大约每周我们必须重新启动一次

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

我还想在.NET中进一步了解这一点

有人有好的链接吗


谢谢

我没有任何链接,但听起来好像你在某处有内存泄漏-尽管我很难确定如何每周专门介绍一次。您的服务是否以代码注册事件?这些经常是gotcha内存泄漏(注册事件的对象已完成,但处理程序未注册,这意味着存在活动引用,因此无法对对象进行垃圾收集)


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

好吧,这有点简单:GC时不时地运行并移除死物。当没有活动引用指向某个对象时,该对象被视为死对象。生命引用通过从根开始(例如静态变量、CPU寄存器等)并遍历所有对象来确定。所有未接触到的物体都已死亡


所以,为了解决这个问题,您应该使用内存分析器并检查内存中保留了哪些对象,例如,由于有一个“缓存”值之类的静态字典而导致的。

不是您想要的,而是为了解决这个特殊问题,我会寻找实现IDisposable但您不会处理的.NET对象。这通常是DB连接,对非托管代码的调用,任何运行时无法完全识别的东西,直到它真正“完成”为止。@Harper不确定这是否会造成泄漏-GC最终会着手清理它-除非持有引用。IDispose接口和后续模式的好处是,您可以释放非托管资源或决定性地关闭连接;如果他们不是这样处理的,GC仍然应该作为最后的手段介入。@Harper,我必须同意Adam的观点。通常,在不调用一次性对象上的
Dispose()
时,会看到锁定的文件、无法打开更多数据库连接等。由于内存使用增长如此缓慢,GC不太可能“提前”运行终结器并释放非托管资源。我真正的怀疑是,在某个地方,有一个长寿命的对象,它包含了对其中一个或多个事物的引用。当然,其他不可IDisposable的实现对象也可能是这样。我通常从这里开始,因为这些东西你会坚持很长一段时间,特别是如果它们的制作成本很高的话。