我正在调试内存泄漏。我无法重现它,但是当程序在特定情况下运行时,我会以大约 60MB/小时的速度稳定泄漏。几天后,当堆约为 2GB 时,我进行转储并附加 WinDbg。
!heapdump –stat
显示有 1.2 GB 的哈希表。这大约是堆的 55%。
!dumpheap -Type 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 构建了什么?