nic*_*ckc 5 .net asp.net clr windbg
我一直在对生产ASP.NET Web应用程序运行负载测试,并且看到在堆上创建了大量的System.WeakReferences.在负载下大约15分钟内,托管堆内存大约增加到3GB,我有大约5,000,000个对System.WeakReference的引用.执行所有代的强制垃圾收集不会释放这些引用.
我已经看过关于__ENCLIST辅助类的帖子,如果在调试中编译程序集,可以为所有创建的对象创建WeakReferences,起初我认为这是问题,但已经验证所有已部署的程序集都是在发行版中构建的.
我一直在使用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的内存.
有谁知道什么可以创建所有这些WeakReferences?
事实证明,由于动态创建大量 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
| 归档时间: |
|
| 查看次数: |
1209 次 |
| 最近记录: |