【发布时间】:2011-02-02 08:56:53
【问题描述】:
我正在分析我的 .net Windows 服务。 我试图发现 OutOfMemoryException 并发现我的堆栈大小 是巨大的并且正在增长,因为线程的数量不断增长。
每个线程在 Windows x64 机器上获得 1024 KB。因此,当我的应用程序有 754 个线程时,堆栈大小将为 772 MB。我的问题是我不知道这些线程来自哪里。最初,我的应用程序的线程数量非常有限,并且它们会随着时间的推移而不断增长。
我有两个怀疑——这些线程要么是由 WCF 创建的,要么是由数据库连接创建的。
我的应用程序同时使用 WCF 和数据集。我还尝试在 Ants do Trace 中分析我的应用程序,我可以看到大量 System.ServiceModel.Channels.ClientReliableDuplexSessionChannel
而且这个数字随着时间的推移而增加。我可以看到创建了数千个这样的对象。所以我想知道谁在创建线程(发现工具、分析器),以及是否是 WCF 创建了这些线程。
更新
我已停止调试我的应用程序以查看线程。我只能看到大量具有类似调用堆栈的 Win32 线程
ntdll.dll!7c82860c()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7c827d99()
kernel32.dll!77e4e02f()
mscorwks.dll!79e7c7a8()
mscorwks.dll!79f943fe()
mscorwks.dll!79f94237()
mscorlib.ni.dll!792f5577()
mscorlib.ni.dll!792e01c5()
【问题讨论】:
-
可以修改每个线程的默认堆大小,但这可能会产生无法预料的后果,并且只会掩盖问题
-
修改堆或堆栈大小似乎不是一个好主意。最好能解决问题。 754 个线程听起来像是出了大问题。你在哪里创建线程?好像你从来没有完成它们。
标签: c# .net wcf multithreading memory-leaks