【发布时间】:2012-02-07 04:23:45
【问题描述】:
我的 .NET 应用程序存在内存问题,在初始化和加载所有内容后,我的应用程序开始在 Gen2 堆中消耗大约 1GB。随着时间的推移(4-5 小时),它会慢慢消耗 Gen2 堆中的 4GB。我使用 WinDbg 来分析我看到的一些对象类型(以及相关的内存使用)正在增加的事情。
所有在实例中增长的对象(和内存使用)都被相同的父对象类型引用。这个父对象类型有大约 3900 个实例——这永远不会改变。不知何故,我将子对象添加到这些父实例中的一些,但我没有一个好方法来查看正在添加的 3900 个实例中的哪一个。
!DumpHeap -mt 会显示我所有的父类型,但大小都是一样的,因为它不包括子类型。
!ObjSize 也会计算子元素的大小,但一次只会使用一个对象作为参数(或所有类型的所有对象 - 不仅仅是我的父类型 - 这是太多的对象)
查看子对象并将它们追溯到父对象也无济于事,因为这些类型有几百万种,我看不到进行某种聚合跟踪的方法。
CLRProfiler 和 ANTS 之类的工具会大大降低我的应用程序的速度(ANTS 更少),以致问题在任何合理的时间内发生。
我已尝试使用通常运行的一小部分数据来运行我的应用程序,以便更轻松地进行调试,但我在这里没有遇到内存问题。我认为我的整个数据集中有一些边缘情况会导致奇怪的事情,但我不知道这些边缘情况是什么,以便将它们隔离到我的整个数据集的一个子集中。
已对此进行了广泛阅读,但没有看到任何人建议在 Gen2 中应该存在的大量对象以及不断增加的少量相同类型的对象时该怎么做。
任何提示将不胜感激。
【问题讨论】:
标签: c# .net debugging memory-leaks windbg