【发布时间】: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