Pull to refresh

Comments 11

Большинство упомянутых утилит не годятся, когда утечку нужно найти в системе (особенно находящейся под нагрузкой), размер хипа которой >4ГБ (например 15ГБ), и в которой выделяется более 500МБ/сек. В то же время есть PerfView, который такое умеет (и умеет многое другое).
А что насчёт поиска утечек в неуправляемой памяти?
Поможет ли он искать там?
DotMemory не помог :(
Неуправляемая это в смысле выделенная через CRT (например malloc) или Win32 API (VirtualAlloc, HeapAlloc, etc.)?
Если да, то я бы искал специальные инструменты для этого. В CRT есть поддержка поиска утечек памяти, для Win32 API есть Application Verifier (но он тормозит приложение чудовищно, может оказаться так что ручное инструментирование точек вызова будет лучше).
Ну и если утечка достаточно большая, то всегда можно снять дамп и покопаться через WinDBG, поискав по содержимому что именно утекает.

WinDBG
Ок, посмотрим, спасибо

На работающей системе всегда можно посмотреть через ETW-утилиты (PerfView тоже использует ETW, просто там интерфейс заточен преимущественно под managed-приложения), например WPA. Про ETW и ассоциированные утилиты (особенно UIforETW) рекомендую почитать тут, от одного из разработчиков Chrome.
У меня проблема была в том, что dotMemory показывал содержимое 1 Gb памяти из 10Gb, а остальное обозначал как unManagemet — и содержимое не отображал, только общий объём (постепенно нарастающий :) )
Тогда я не нашёл, какой прогой можно анализировать содержимое этой памяти.

Я думал, что dotMemory как раз относится к ETW-утилитам.

В 5 пункт можно добавить создание инстанса с временем жизни Transient. Хз как это разруливает asp, но в консоли лëгкий способ выстрелить себе в ногу.

Э-э-э, а как Transient может приводить к утечкам памяти сам по себе, если ссылка на него нигде не сохраняется кроме как потребителем?


Избыточное потребление памяти — легко, но вот утечку так получить невозможно.

Используйте шаблон Dispose для предотвращения утечек неуправляемой памяти

Этот шаблон давно уже устарел, хватит рекомендовать его!


Правильный способ — обернуть каждый неуправляемый ресурс в SafeHandle, а для всех остальных классов реализовать метод Dispose без всяких изысков и финализаторов.

Sign up to leave a comment.