我怎样才能弄清楚为什么我的.net服务会扼杀内存?

时间:2011-06-27 14:28:08

标签: c# memory-leaks windows-services

我们有一个.net c#服务,当tured正在咀嚼越来越多的内存。它有一个'Service'派生类,它基本上创建了其他对象,这些对象封装了服务要支持的各个功能。我想也许我正在创建一个对象,并且由于编程错误而没有收集垃圾。

任何人都知道在不设置断点的情况下找出正在发生的事情的最佳方法吗?

7 个答案:

答案 0 :(得分:1)

您可以使用memprofilerants profiler等内存分析器,这个问题也可以帮助What Are Some Good .NET Profilers?

它们让您很好地了解正在创建的对象,它们所处的生成,它们正在使用的内存等。大多数情况下,您可以使用分析器缩小问题范围。

答案 1 :(得分:0)

最好的方法是运行Visual Studio中的Performance Profiler。它允许您查看对象的生命周期。

This link might be helpful

答案 2 :(得分:0)

您必须使用需要处理的物品 一些很好的例子是流和Web客户端。

答案 3 :(得分:0)

创建一个文本日志并记录发生的所有事情并从那里开始工作。特别是对于服务,这是找出可能出错的最简单方法。只需打印出事件,对象状态及其属性。

也许你可以通过这种方式找到答案。

祝你好运

答案 4 :(得分:0)

使用CLR Profiler。它是专门用于检查内存使用情况的分析器。

1.1 Profiler

2.0 Profiler

4.0 Profiler

答案 5 :(得分:0)

您需要使用内存分析器来查看哪些对象导致内存泄漏。我在这种情况下使用这个:http://www.jetbrains.com/profiler/

答案 6 :(得分:0)

打开任务管理器并观察内存

将一个主要的执行包裹在一个类中(这里我使用了BLL)

然后从BLL打电话

然后尝试一次使用一个using语句包装每个顶级片段

using ( TheBll bll = new TheBll)
            {
                bll.ProcessStuff();
            }

这使得代码完成后大多数每个签名都会解除分配,这样可以更容易地清理内存。

然后重新开始,如果记忆停止上升或减慢,你已经找到了一个杯子,深入到那个。

如果您在使用using语句包装所有顶级调用后对结果感到满意,那么在深入挖掘之前可能会完成。 (虽然你应该挖掘,只是为了在你不赶时间时学习什么是真正的错误)