В нашем веб-приложении ASP.NET мы наблюдаем довольно большую утечку памяти, которую я сейчас расследую. Используя WinDbg, я обратился к крупнейшим потребителям памяти в нашем приложении, которые (запустили !dumpheap -stat
в консоли WinDbg, чтобы получить их):
MethodTable Addr Count Overall size Type
...
000007fee8306e10 212928 25551360 System.Web.UI.LiteralControl
000007feebf44748 705231 96776168 System.Object[]
000007fee838fd18 4394539 140625248 System.Web.Caching.CacheDependency+DepFileInfo
000007fee838e678 4394614 210941472 System.Web.FileMonitorTarget
000007feebf567b0 18259 267524784 System.Collections.Hashtable+bucket[]
00000000024897c0 1863 315249528 Free
000007feebf56cd0 14315 735545880 System.Byte[]
000007feebf4ec90 1293939 1532855608 System.String
Насколько я знаю, большое количество String
объектов может быть вполне нормальным; все же определенно есть место для улучшения. Но что меня действительно зудит, так это количество System.Web.FileMonitorTarget
объектов: у нас в куче более 4 миллионов экземпляров (48 байтов)! Используя два дампа памяти и сравнивая их, я обнаружил, что эти объекты не очищаются GC.
Я пытаюсь выяснить: откуда эти объекты? Я уже пробовал ANTS Memory Profiler, чтобы добраться до корня зла, но он не ведет ни к какому из наших собственных классов. Я вижу связь с System.Web.Caching.CacheDependency+DepFileInfo
и, следовательно, с System.Web.Cache
, но мы не используем файловые зависимости для аннулирования записей нашего кэша .
Кроме того, 14315 экземпляров System.Byte[]
составляют более 700 МБ в куче, что меня оглушает - единственное место, где мы используем Byte[]
, - это наш компонент для загрузки изображений, но у нас есть только около 30 загрузок изображений в день. .
Что может быть источником этих Byte
массивов и FileMonitorTarget
объектов? Любые советы приветствуются!
Оливер
P.S. Кто-то задал почти тот же вопрос здесь , но единственный «ответ» был очень общим.