我正在分析我的 .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()
最佳答案
您可以使用调试器查看程序 - 然后您可以看到所有这些线程正在做什么(其中大多数线程可能具有非常相似的调用堆栈)。
关于c# - OutOfMemoryException,堆栈大小巨大,线程数量大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2543648/