OutOfMemoryException,大型私有数据

时间:2010-03-31 09:32:09

标签: .net memory-leaks memory-management taskmanager window-handles

在之前的系列中:

OutOfMemoryException, stack size is huge, large number of threads

我有一个耗费大量内存的.net Windows服务。 GC堆不大。堆栈大小也不大。什么是大的东西称为私人数据。我还可以在任务管理器中看到我的应用程序消耗了很多taskmanager称之为句柄的东西。我的应用程序消耗2326个句柄。我相信这些句柄是一些占用私人数据的窗口句柄。我可以看到这个私有数据被占用了 标记为线程环境块的块。那是什么?

Screenshot of my application memory usage by VMMap

Screenshot of my application memory usage by Task Manager

更新

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

alt text http://i021.radikal.ru/1003/27/304433b1ae29.jpg

2 个答案:

答案 0 :(得分:2)

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

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

祝你好运!

答案 1 :(得分:1)

是的,非常耗费资源。我猜你用[ThreadStatic]属性标记的变量。你有方式太多线程。