Comments 11
Большинство упомянутых утилит не годятся, когда утечку нужно найти в системе (особенно находящейся под нагрузкой), размер хипа которой >4ГБ (например 15ГБ), и в которой выделяется более 500МБ/сек. В то же время есть PerfView, который такое умеет (и умеет многое другое).
А что насчёт поиска утечек в неуправляемой памяти?
Поможет ли он искать там?
DotMemory не помог :(
Поможет ли он искать там?
DotMemory не помог :(
Неуправляемая это в смысле выделенная через CRT (например malloc) или Win32 API (VirtualAlloc, HeapAlloc, etc.)?
Если да, то я бы искал специальные инструменты для этого. В CRT есть поддержка поиска утечек памяти, для Win32 API есть Application Verifier (но он тормозит приложение чудовищно, может оказаться так что ручное инструментирование точек вызова будет лучше).
Ну и если утечка достаточно большая, то всегда можно снять дамп и покопаться через WinDBG, поискав по содержимому что именно утекает.
Если да, то я бы искал специальные инструменты для этого. В CRT есть поддержка поиска утечек памяти, для Win32 API есть Application Verifier (но он тормозит приложение чудовищно, может оказаться так что ручное инструментирование точек вызова будет лучше).
Ну и если утечка достаточно большая, то всегда можно снять дамп и покопаться через WinDBG, поискав по содержимому что именно утекает.
WinDBG
Ок, посмотрим, спасибо
На работающей системе всегда можно посмотреть через ETW-утилиты (PerfView тоже использует ETW, просто там интерфейс заточен преимущественно под managed-приложения), например WPA. Про ETW и ассоциированные утилиты (особенно UIforETW) рекомендую почитать тут, от одного из разработчиков Chrome.
У меня проблема была в том, что dotMemory показывал содержимое 1 Gb памяти из 10Gb, а остальное обозначал как unManagemet — и содержимое не отображал, только общий объём (постепенно нарастающий :) )
Тогда я не нашёл, какой прогой можно анализировать содержимое этой памяти.
Я думал, что dotMemory как раз относится к ETW-утилитам.
Тогда я не нашёл, какой прогой можно анализировать содержимое этой памяти.
Я думал, что dotMemory как раз относится к ETW-утилитам.
Или lldb + sos, если в linux
интересный материал, спасибо!
В 5 пункт можно добавить создание инстанса с временем жизни Transient. Хз как это разруливает asp, но в консоли лëгкий способ выстрелить себе в ногу.
Используйте шаблон Dispose для предотвращения утечек неуправляемой памяти
Этот шаблон давно уже устарел, хватит рекомендовать его!
Правильный способ — обернуть каждый неуправляемый ресурс в SafeHandle, а для всех остальных классов реализовать метод Dispose без всяких изысков и финализаторов.
Sign up to leave a comment.
Поиск, устранение и предупреждение утечек памяти в C# .NET: 8 лучших практик