【问题标题】:OutOfMemoryException, stack size is huge, large number of threadsOutOfMemoryException,堆栈大小巨大,线程数多
【发布时间】: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


【解决方案1】:

您可以使用调试器查看程序 - 然后您可以看到所有这些线程在做什么(它们中的大多数可能具有非常相似的调用堆栈)。

【讨论】:

  • 您好 Pent,已发布结果。看起来我没有加载符号。
  • 您只是在调试应用程序的非托管部分。附加到进程时,选择“托管”作为要调试的代码类型之一。您可以从 Microsoft 符号服务器加载 kernel32.dll、ntdll.dll 等的符号。
  • Pent 非常感谢您提供的非常简单的建议。我发现了这个问题。我有一个本地工作负载管理器类,它有点像托管线程池。我所有的线程都是等待锁定语句的计时器触发事件​​
猜你喜欢
  • 2011-07-27
  • 2011-05-08
  • 1970-01-01
  • 2015-11-11
  • 2017-12-11
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多