C# 如何调试潜在的内存泄漏?

C# 如何调试潜在的内存泄漏?,c#,memory-leaks,windows-services,C#,Memory Leaks,Windows Services,我对windows服务进行了编程,以完成日常工作 我InstallUtil将它发送到windows服务,它会醒来做一些事情,然后thread.sleep(5分钟) 代码很简单,但我注意到一个潜在的内存泄漏。我使用DOS任务列表跟踪它并绘制了一张图表: 我可以说很明显有内存泄漏,尽管很少 我的代码如下,请帮我找到潜在的漏洞。谢谢 public partial class AutoReport : ServiceBase { int Time = Convert.T

我对windows服务进行了编程,以完成日常工作

InstallUtil
将它发送到windows服务,它会醒来做一些事情,然后
thread.sleep(5分钟)

代码很简单,但我注意到一个潜在的内存泄漏。我使用
DOS任务列表
跟踪它并绘制了一张图表:

我可以说很明显有内存泄漏,尽管很少

我的代码如下,请帮我找到潜在的漏洞。谢谢

    public partial class AutoReport : ServiceBase
    {
        int Time = Convert.ToInt32(AppSettings["Time"].ToString());
        private Utilities.RequestHelper requestHelper = new RequestHelper();

        public AutoReport()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Thread thread = new Thread(new ParameterizedThreadStart(DoWork));
            thread.Start();
        }

        protected override void OnStop()
        {
        }

        public void DoWork(object data)
        {
            while (true)
            {
                string jsonOutStr = requestHelper.PostDataToUrl("{\"KeyString\":\"somestring\"}", "http://myurl.ashx");
                Thread.Sleep(Time);
            }
        }
    }
编辑:在使用WinDbg@Russell建议后。我应该如何处理这些课程

MT  Count   TotalSize   ClassName
79330b24    1529    123096  System.String
793042f4    471 41952   System.Object[]
79332b54    337 8088    System.Collections.ArrayList
79333594    211 70600   System.Byte[]
79331ca4    199 3980    System.RuntimeType
7a5e9ea4    159 2544    System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry
79333274    143 30888   System.Collections.Hashtable+bucket[]
79333178    142 7952    System.Collections.Hashtable
79331754    121 57208   System.Char[]
7a5d8120    100 4000    System.Net.LazyAsyncResult
00d522e4    95  5320    System.Configuration.FactoryRecord
00d54d60    76  3952    System.Configuration.ConfigurationProperty
7a5df92c    74  2664    System.Net.CoreResponseData
7a5d8060    74  5032    System.Net.WebHeaderCollection
79332d70    73  876 System.Int32
79330c60    73  1460    System.Text.StringBuilder
79332e4c    72  2016    System.Collections.ArrayList+ArrayListEnumeratorSimple
7.93E+09    69  1380    Microsoft.Win32.SafeHandles.SafeTokenHandle
7a5e0d0c    53  1060    System.Net.HeaderInfo
7a5e4444    53  2120    System.Net.TimerThread+TimerNode
79330740    52  624 System.Object
7a5df1d0    50  2000    System.Net.AuthenticationState
7a5e031c    50  5800    System.Net.ConnectStream
7aa46f78    49  588 System.Net.ConnectStreamContext
793180f4    48  960 System.IntPtr[]

要查找内存泄漏,应长时间查看。如果您看到所有堆中的句柄数或总字节数在不断增加而从不减少,那么您就有了真正的内存泄漏。然后,您可以使用VisualStudio中的分析工具来跟踪泄漏。还有一个工具可以很好地工作。

以下是我查找内存泄漏的方法:

1) 如果您还没有,请下载。它是一个非常强大的调试器(尽管很难使用,因为它很复杂)

2) 运行WinDbg并通过按F6键并选择exe将其附加到进程

3) 如果已附加,请键入以下命令:(后跟enter)

//这将加载托管扩展

.loadby sos clr

//这将转储堆上所有对象的详细信息

!dumpheap-stat

//这将再次启动服务

g


现在等待几分钟,然后键入Ctrl+Break以重新进入服务。运行
!再次使用Dumpheap-stat
命令查找堆上的内容。如果您有内存泄漏(在托管代码中),那么您将看到一个或多个类随着时间的推移不断添加到堆中。现在您知道了内存中保存的内容,因此您知道在代码中查找问题的位置。如果您愿意,您可以确定WinDbg中泄漏的对象引用的内容,但这是一个复杂的过程。如果您决定使用WinDbg,那么您可能希望首先阅读Tess的博客并执行。

您需要使用分配探查器来检测内存泄漏,为此,我可以推荐()

并阅读:


Maby可能也很有帮助

很难说,但我怀疑DoWork中while循环中的这一行:

JsonIn jsonIn = new JsonIn { KeyString = "secretekeystring", };

尽管
jsonin
只在while块中有作用域,但我要冒的危险是,垃圾收集器正在花时间删除不需要的实例

几乎不可能有人能够帮助您仅从代码中锁定内存泄漏。我在您提供的代码片段中看不到任何内容,因此它可能位于RequestHelper类中。找出哪些内存泄漏的最简单方法是使用windbg进入服务,并找出heapA上的哪些对象是调试生产问题的好资源。阅读WinDbg结果对我来说很难。我按计数下单,计数48时切断。但他们都来自
系统
。你能告诉我是什么问题吗?你是否运行了“g”命令来重新启动它?您希望让它运行足够长的时间,以泄漏相当多的内存,然后再次查看堆上的内容。无论数量增加了多少,都可能是内存泄漏的罪魁祸首。只有你知道什么看起来不对劲。我仍然无法证明是或否。这让我有点困扰。也许我会转向其他解决方案,比如Linux中的
cron
。谢谢你的帮助。我更改了代码。请看编辑。现在它不应该是关于
JsonIn