Предположим, у меня есть приложение WinForms .NET, написанное на C #. Это приложение выделяет большие объемы памяти как из управляемых, так и из неуправляемых куч. Я могу (относительно) легко выяснить детали выделения (кто, когда, сколько и т. Д.) Управляемых объектов, используя такие инструменты, как Red Gate ANTS Profiler (который я не использовал) или JetBrains dotTrace .
Когда я сталкиваюсь с проблемами, когда управляемые объекты используют значительные собственные ресурсы (например, Image или большие COM-объекты) или когда я обращаюсь к неуправляемым сторонним библиотекам со значительными потребностями в памяти. До сих пор мне действительно приходилось выполнять какую-то детективную работу, чтобы выяснить 1) является ли управляемый или неуправляемый код бестселлером памяти и 2) кто использует большую часть неуправляемой кучи.
Единственный метод, который у меня есть на данный момент, - это установить счетчики производительности в perfmon, которые сравнивают размеры управляемой и неуправляемой кучи, распределения и т. Д. Если неуправляемая куча продолжает расти, пока управляемая куча стабильна, я знаю, что нужно начинать просмотр неуправляемых библиотек и / или объектов .NET, которые используют собственные ресурсы.
Какова наилучшая комбинация инструментов и методов, помогающих разработчикам в значительных объемах управляемого и неуправляемого кода?
ОБНОВЛЕНИЕ: Чтобы быть более понятным, я хотел бы знать, как обнаружить проблемы с памятью (интенсивное использование, утечки) в неуправляемом коде, вызываемом из управляемого кода. Я считаю, что такие продукты, как dotTrace, отслеживают только управляемые объекты.