Я исследую проблему утечки памяти с помощью PerfMon и WinDbg. Я заметил, что счетчик «Большая куча памяти» увеличен с 10 МБ до 37 МБ. После принудительной сборки мусора его можно уменьшить только до 28 МБ.
(Независимо от того, сколько раз я повторяю операцию (создание / уничтожение), после сборки мусора куча больших объектов стабильна на уровне 28 МБ).
Я хотел бы знать, какие объекты вызывают проблему с утечкой, поэтому я запускаю WinDbg с командой '! Dumpheap -min 85000'. Сделано два снимка, первый был сделан до утечки памяти; Второй - после утечки памяти:
До:
MT Count TotalSize Class Name
6f39fb08 1 89024 System.String
6f3a4aa0 1 107336 System.Byte[]
6f356d84 2 262176 System.Object[]
00360e4c 1 350392 System.Collections.Generic.Dictionary`2+Entry[Int64,Int32][]
6f3a2a94 3 592584 System.Int32[]
00360c24 1 727072 System.Collections.Generic.Dictionary`2+Entry[String,Int64][]
0bc78b34 4 2754488 System.Collections.Generic.Dictionary`2+Entry[Int64, AccountNode][]
00730260 10 5375572 Free
После:
MT Count TotalSize Class Name
6f39fb08 1 89024 System.String
6f3a4aa0 1 107336 System.Byte[]
6f3a55d8 2 202080 System.Collections.Hashtable+bucket[]
6f356d84 2 262176 System.Object[]
00360e4c 1 350392 System.Collections.Generic.Dictionary`2+Entry[Int64,Int32][]
00360c24 1 727072 System.Collections.Generic.Dictionary`2+Entry[String,Int64][]
6f3a2a94 4 738008 System.Int32[]
6cf02838 1 872488 System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.ComponentModel.PropertyKey, WindowsBase],[MS.Internal.ComponentModel.DependencyPropertyKind, WindowsBase]][]
0bc78b34 4 2754488 System.Collections.Generic.Dictionary`2+Entry[Int64, AccountNode][]
00730260 14 21881328 Free
Total 31 objects
Если сравнивать эти два снимка, наибольшая разница - это размер «Бесплатно». его размер увеличился почти на 16 МБ. Может ли кто-нибудь сказать мне, что означает «бесплатно», это свободное место? Увеличение вызвано возмущениями?
Согласно этой статье, счетчик производительности «Размер кучи больших объектов», похоже, включает свободное место. Так что в моем случае утечки памяти в куче больших объектов не так уж и много, всего 2 МБ (= 28-10-16), верно?