Отлаживаю утечку памяти. Я не могу воспроизвести это, но когда программа запускается в определенных обстоятельствах, я получаю постоянную утечку со скоростью около 60 МБ / час. Через несколько дней беру дамп, когда куча ~ 2Гб и подключаю WinDbg.
! heapdump –stat
Показывает, что хеш-таблицы имеют размер 1,2 ГБ. Это примерно 55% от кучи.
! dumpheap -Type System.Collections.Hashtable + KeyCollection
дает адрес 153 080 экземпляров Hashtable.
! gcroot некоторых из этих экземпляров означает, что все они принадлежат Threads, принадлежащим 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?