我对 Windows 服务进行了编程来完成日常工作。
I InstallUtil
它到 Windows 服务,它会醒来并做一些事情,然后thread.sleep(5min)
The code is simple, but I've noticed a potential memory leak. I traced it using DOS tasklist
and drew a chart:
![enter image description here](https://i.stack.imgur.com/JT01l.png)
我可以说很明显存在内存泄漏,尽管很小。
我的代码如下,请帮我找到潜在的泄漏。谢谢。
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[]
这就是我查找内存泄漏的方法:
1) 下载WinDbg如果您还没有。它是一个非常强大的(尽管由于复杂而难以使用)调试器。
2) 运行 WinDbg 并将其附加到您的进程,方法是按 F6 并选择您的 exe。
3)附加后,键入以下命令:(然后按 Enter)
//这将加载托管扩展
.loadby sos clr
//这将转储堆上所有对象的详细信息
!dumpheap -stat
//这将再次启动服务
g
现在等待几分钟并键入 Ctrl+Break 以重新进入服务。跑过!Dumpheap -stat
再次命令查看堆上现在有什么。如果您有内存泄漏(在托管代码中),那么您将看到一个或多个类随着时间的推移不断添加到堆中。您现在知道内存中保存了什么,因此您知道在代码中的何处查找问题。如果您愿意,您可以弄清楚是什么保存了对从 WinDbg 中泄漏的对象的引用,但这是一个复杂的过程。如果您决定使用 WinDbg,那么您可能需要首先阅读 Tess 的博客并执行以下操作labs.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)