1

在之前的系列中:

OutOfMemoryException,堆栈大小巨大,线程数多

我有一个消耗大量内存的 .net windows 服务。GC堆不大。堆栈大小也不大。重要的是所谓的私人数据。我还可以在任务管理器中看到我的应用程序消耗了很多任务管理器调用句柄的东西。我的应用程序消耗 2326 个句柄。我相信这些句柄是一些占用私有数据的窗口句柄。我可以看到这个私有数据被标记为Thread Environment Block的块占用。那是什么?

VMMap 我的应用程序内存使用情况的屏幕截图

任务管理器对我的应用程序内存使用情况的屏幕截图

更新

我运行 ProcessExplorer。目前我的服务有两个实例正在运行。我可以看到它们为 Gen2 GC 消耗了大量的虚拟内存。这看起来很可疑。为 GC Heap 保留的总大小对于两个进程也是相同的。

替代文字

4

2 回答 2

2

似乎您有经典的内存泄漏,当新创建的对象无法收集时,因为它们是从垃圾收集根中引用的。

摆脱此类问题的最有效方法 - 使用 WinDBG + SOS 和 !gcroot 命令。可以在此处找到内存泄漏错误调查的示例:http: //blogs.msdn.com/tess/archive/2008/04/03/net-debugging-demos-lab-7-memory-leak-review.aspx

祝你好运!

于 2010-03-31T11:23:13.507 回答
1

是的,相当消耗资源。我猜你用 [ThreadStatic] 属性标记的变量。你的线程太多了。

于 2010-03-31T10:25:34.473 回答