【问题标题】:How to debug the potential memory leak?如何调试潜在的内存泄漏?
【发布时间】:2011-12-15 08:42:18
【问题描述】:

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

我将InstallUtil它发送到Windows服务,它会醒来并做一些事情,然后thread.sleep(5min)

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

我可以说很明显有内存泄漏,虽然很少。

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

    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[]

【问题讨论】:

  • 几乎不可能有人能够帮助您从代码中找出内存泄漏。我在你提出的那个 sn-p 中看不到任何东西,所以它很可能在 RequestHelper 类中。找出泄漏内存的最简单方法是使用 windbg 侵入服务并找出堆上的对象
  • 调试生产问题的好资源。 blogs.msdn.com/b/tess

标签: c# memory-leaks windows-services


【解决方案1】:

这就是我寻找内存泄漏的方法:

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

2) 运行 WinDbg 并将其附加到您的进程,方法是按 F6 并选择您的 exe。

3) 附加后键入以下命令:(后跟回车)

//这将加载托管扩展

.loadby sos clr

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

!dumpheap -stat

//这将再次启动服务

g

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

【讨论】:

  • 阅读 WinDbg 结果对我来说很难。我通过Count 订购它,并以48 的数量截止。但它们都来自System。你能提出什么问题吗?
  • 您是否运行了“g”命令重新开始运行?您想让它运行足够长的时间以泄漏大量内存,然后再次查看堆上的内容。无论数量增加了什么,都可能是内存泄漏的罪魁祸首。只有你知道什么看起来不合时宜。
  • 我仍然无法证明是或否。这让我有点困扰。也许我会转向其他一些解决方案,比如 Linux 中的cron。感谢您的帮助。
【解决方案2】:

你需要使用分配分析器来检测内存泄漏,有一些很好的分析器,我可以推荐AQTime (see this video)

阅读:How to Locate Memory Leaks Using the Allocation Profiler

Maby this article 也有帮助

【讨论】:

    【解决方案3】:

    要查找内存泄漏,您应该长时间查看performance counters。如果您看到所有堆中的句柄数或总字节数一直在增长而从未减少,那么您就有了真正的内存泄漏。然后,您可以使用例如 Visual Studio 中的分析工具来跟踪泄漏。还有一个来自redgate 的工具,效果很好。

    【讨论】:

      【解决方案4】:

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

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

      虽然jsonin 仅在 while 块内有作用域,但我会冒险垃圾收集器正在花时间删除不需要的实例。

      【讨论】:

      • 我更改了我的代码。请参阅编辑。现在不应该是关于JsonIn
      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      相关资源
      最近更新 更多