我正在调试内存泄漏。我无法重现它,但是当程序在特定情况下运行时,我经常以约60MB /小时的速度泄漏。几天后,当堆为〜2GB时我进行了转储并附加了WinDbg。
!heapdump –stat
显示有1.2 GB的哈希表。
这大约是堆的55%。
!dumpheap-类型System.Collections.Hashtable + KeyCollection
给出153,080个Hashtable实例的地址。
其中一些实例的!gcroot表示它们全部由Me.Logger拥有的线程拥有。
RSP:28f67e840:Root:0000000245edb7d0(Me.Logger)->
0000000245edb9d8(System.Threading.Thread)->
00000002459b9830(System.Runtime.Remoting.Contexts.Context)->
00000002459b9548(System.AppDomain)->
0000000245a1fed0(System.ResolveEventHandler)->
00000002259697a0(System.Web.Compilation.BuildManager)->
0000000245a20120(System.Web.Compilation.MemoryBuildResultCache)->
00000002459c2a48(System.Web.Caching.CacheMultiple)->
00000002459c2a70(System.Object[])->
00000002459c7e08(System.Web.Caching.CacheSingle)->
00000002459c9008(System.Web.Caching.CacheUsage)->
00000002459c9030(System.Object[])->
00000002459c9138(System.Web.Caching.UsageBucket)->
00000001b996fba8(System.Web.Caching.UsagePage[])->
00000001ae054388(System.Web.Caching.UsageEntry[])->
0000000251576590(System.Web.Caching.CacheEntry)->
00000002515761a0(System.Web.Mobile.MobileCapabilities)->
00000002515742c8(System.Collections.Hashtable)->
0000000251576548(System.Collections.Hashtable+KeyCollection)
我不知道如何解释此输出。似乎System.Web.Compilation.BuildManager只是具有大量的缓存。
BuildManager,MobileCapabilities,ResolveEventHandler-我的代码库中未使用任何这些。
我是WinDbg的新手。如何进一步调试?
我如何看待哈希表中的内容? (SoS v2.0.50727,所以没有!DumpCollection)。
如何查看BuildManager的构建内容?
最佳答案
您是否尝试过SOSEX扩展? http://www.stevestechspot.com/default.aspx。
它具有SOS的大部分功能,包括您需要的!DumpCollection命令(尽管我尚未测试它是否可与CLR的V2一起使用)以及其他一些有用的功能。
同样,也许这个博客可以为您提供帮助,她在托管内存泄漏调试方面有一些不错的信息:
http://blogs.msdn.com/b/tess/archive/2008/04/03/net-debugging-demos-lab-7-memory-leak-review.aspx?PageIndex=1