我一直在针对生产 ASP.NET Web 应用程序运行负载测试,并且看到在堆上创建了大量 System.WeakReference。在大约 15 分钟内,负载管理堆内存已飙升至大约 3GB,并且我有大约 5,000,000 个对 System.WeakReference 的引用。对所有代执行强制垃圾回收不会释放这些引用。
我看过有关 __ENCLIST 帮助程序类的帖子,如果在调试中编译程序集,可以为创建的所有对象创建弱引用,起初我认为这是问题所在,但已验证所有部署的程序集都是在发行版中构建的。
我一直在使用 WinDbg 来调试该过程,这是最后几行!dumpheap -stat
000007fef788e0c0 39253 18510000 System.Collections.Hashtable+bucket[]
00000000021bf120 94336 151023192 Free
000007fef7887e98 5959 189838752 System.Char[]
000007fef7874390 517429 589750224 System.Object[]
000007fef78865a0 1531190 1230824112 System.String
000007fef787dab8 51723338 1655146816 System.WeakReference
正如您所看到的,这些 System.WeakReferences 消耗了大约 1.5GB 的内存。
有谁知道什么可能创建所有这些弱引用?
事实证明,由于动态创建大量 System.Diagnostics.TraceSwitch 实例,导致 System.WeakReference 泄漏,在内部 TraceSource/TraceSwitch 为新的 TraceSource/TraceSwitch 分配 WeakReference 并将 WeakReference 放入列表中。尽管 WeakReference 允许 TraceSource/TraceSwitch 被垃圾收集,但 WeakReference 本身永远不会被释放,从而导致内存泄漏。
可以在这里找到更多信息
http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource(VS.80).aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)