FileMonitorTarget/CacheDependency的内存泄漏+;ASP.NET中的DepFileInfo

FileMonitorTarget/CacheDependency的内存泄漏+;ASP.NET中的DepFileInfo,asp.net,memory-leaks,windbg,Asp.net,Memory Leaks,Windbg,在我们的ASP.NET web应用程序中,我们遇到了一个相当大的内存泄漏问题,我正在对此进行调查。使用WinDbg,我找到了我们应用程序中最大的内存消耗者,它们是(在WinDbg控制台中运行!dumpheap-stat,以获得这些): 据我所知,大量的String对象是很正常的;但肯定还有改进的余地。但真正让我发痒的是System.Web.FileMonitorTarget对象的数量:堆上有400多万个实例(48字节)!使用两个内存转储并比较它们,我发现这些对象没有被GC清除 我想知道的是:这些

在我们的ASP.NET web应用程序中,我们遇到了一个相当大的内存泄漏问题,我正在对此进行调查。使用WinDbg,我找到了我们应用程序中最大的内存消耗者,它们是(在WinDbg控制台中运行
!dumpheap-stat
,以获得这些):

据我所知,大量的
String
对象是很正常的;但肯定还有改进的余地。但真正让我发痒的是
System.Web.FileMonitorTarget
对象的数量:堆上有400多万个实例(48字节)!使用两个内存转储并比较它们,我发现这些对象没有被GC清除

我想知道的是:这些物体是从哪里来的?我已经尝试了ANTS Memory Profiler来找到邪恶的根源,但它与我们自己的任何一个职业都没有任何联系。我看到了与
System.Web.Caching.CacheDependency+DepFileInfo
的连接,从而看到了
System.Web.Cache
,但是我们不使用文件依赖项来使缓存项无效

另外,堆上有14315个
System.Byte[]
实例,占了700多MB,这让我震惊-我们唯一使用
Byte[]
的地方是我们的图像上传组件,但我们每天只有大约30个图像上传

这些
字节
数组和
文件监控目标
对象的来源可能是什么?欢迎任何提示

奥利弗


另外,有人问了几乎相同的问题,但唯一的“答案”是非常笼统的。

有几件事我要研究一下。你说得对,字符串经常被大量使用。堆上仍然有大约1.4 GB的字符串。听起来对吗?如果不是,我会调查的。如果在预期范围内,就忽略它

如果怀疑
FileMonitorTarget
和/或
Byte[]
泄漏,请使用
转储实例!dumpheap-mt XXX
,其中XXX是列出的类型的方法表。您可能希望使用PSSCOR2而不是SOS,因为它使此任务更容易(来自
!dumpheap
的输出显示一个增量列,您可以限制转储的实例数)


下一步要做的事情是开始研究如何让特定实例保持活动状态。
!gcroot
命令将告诉您特定实例的根。随机选取一个实例并检查根。如果一切都如预期的那样,继续下一步。如果您的应用程序正在泄漏这些类型的实例,那么您很可能会得到一个本应被释放的实例。一旦你找到根,你就需要弄清楚代码的哪一部分会抓住这些根。一个常见的来源是取消订阅的事件,但对象保持活动状态还有其他可能的原因

ASP.NET会自动创建System.Web.Caching.CacheDependency+DepFileInfo类型的对象,以监视对网站的文件更改。因此,即使您没有特别使用FileDependency缓存过期,ASP.NET本身也会这样做

如果我对其中一些对象运行转储字段,我会得到一个指向控件/页面的路径

0:000> !df -field _filename 0d3f24ec 
Name: System.String
MethodTable: 79330b24
EEClass: 790ed65c
Size: 180(0xb4) bytes
GC Generation: 2
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: C:\inetpub\wwwroot\Website\Application\Base\UserControl\Messages.ascx
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
79332d70  4000096        4         System.Int32  1 instance       82 m_arrayLength
79332d70  4000097        8         System.Int32  1 instance       81 m_stringLength
79331804  4000098        c          System.Char  1 instance       44 m_firstChar
79330b24  4000099       10        System.String  0   shared   static Empty
    >> Domain:Value  000e0ba0:02581198 00109f28:02581198 <<
79331754  400009a       14        System.Char[]  0   shared   static WhitespaceChars
    >> Domain:Value  000e0ba0:025816f0 00109f28:02586410 <<
0:000>!df-字段_文件名0d3f24ec
名称:System.String
方法表:79330b24
EEClass:790ed65c
大小:180(0xb4)字节
GC生成:2
(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
字符串:C:\inetpub\wwwroot\Website\Application\Base\UserControl\Messages.ascx
领域:
MT字段偏移类型VT属性值名称
79332d70 4000096 4 System.Int32 1实例82 m_阵列长度
79332d70 4000097 8 System.Int32 1实例81米长
79331804 4000098 c System.Char 1实例44 m_firstChar
79330b24 4000099 10系统。字符串0共享静态空

>>域:Value 000e0ba0:02581198 00109f28:02581198>域:Value 000e0ba0:025816f0 00109f28:02586410此服务器上正在运行哪些其他软件?不值得注意-我们有一台服务器专门用于我们的web应用程序。或者你是在暗示什么?好的,ASP.NET会话状态服务器也在那里运行。你在使用页面输出缓存吗?你的应用有多大?目前我们只在一个简单的广告页面上使用输出缓存。就…而言有多大。。。?我们每天的页面浏览量约为120.000次,独立访客约为22.000次。感谢您的提示,Brian。我已经用ANTS内存分析器解决了同样的问题,但是GCRoots一点也不可疑。不过,我还没有使用PSSCOR2。我会试试看。干杯,奥利弗
0:000> !df -field _filename 0d3f24ec 
Name: System.String
MethodTable: 79330b24
EEClass: 790ed65c
Size: 180(0xb4) bytes
GC Generation: 2
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: C:\inetpub\wwwroot\Website\Application\Base\UserControl\Messages.ascx
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
79332d70  4000096        4         System.Int32  1 instance       82 m_arrayLength
79332d70  4000097        8         System.Int32  1 instance       81 m_stringLength
79331804  4000098        c          System.Char  1 instance       44 m_firstChar
79330b24  4000099       10        System.String  0   shared   static Empty
    >> Domain:Value  000e0ba0:02581198 00109f28:02581198 <<
79331754  400009a       14        System.Char[]  0   shared   static WhitespaceChars
    >> Domain:Value  000e0ba0:025816f0 00109f28:02586410 <<