Анализ утечек памяти.NET
Я пытаюсь найти утечку памяти в одном из наших приложений, но это довольно сложно.
Я проанализировал программу с помощью профилировщика памяти Ants и обнаружил, что утечка связана с неуправляемым кодом, для которого профилировщик памяти Ants не подходит: http://www.red-gate.com/supportcenter/content/ANTS_Memory_Profiler/help/7.4/amp_unmanaged_use Я проверил вещи в разделах "графические буферы" и "Проблемы с удалением объектов в неуправляемом коде", но это не дало никаких результатов.
Затем я использовал средство диагностики отладки Windows и провел анализ нагрузки на память. Большая часть использования памяти находится в собственных кучах: куча 6 0x01ee0000 (не куча процесса по умолчанию). Сводная память виртуального распределения мала, а объем невыполненной памяти распределения в анализе утечек низкий: ни один из модулей не использует слишком много памяти.
Как мне найти место утечки памяти сейчас?
2 ответа
Диагностика утечки памяти является встроенной функцией Microsoft CRT, функция _CrtDumpMemoryLeaks() предоставляет отчет. Его использование требует написания модульных тестов в собственном коде, чтобы вы могли включить распределитель отладки, чтобы эта функция работала. Что, в свою очередь, требует наличия исходного кода для этого неуправляемого кода, чтобы вы могли включить распределитель отладки с помощью команды <crtdbg.h>
Заголовок файла и может построить модульный тест. Основное руководство здесь.
Обычным камнем преткновения является то, что у вас нет доступа к исходному исходному коду. В этом случае вам нужно будет поработать с продавцом или автором этого кода, чтобы решить эту проблему. Сверните мяч, предоставив ему небольшой репроект, который демонстрирует проблему.
Если вам нужен реальный инструмент для профилирования памяти, взгляните на http://memprofiler.com/support.aspx. Безусловно, один из лучших инструментов для утечек памяти, который я когда-либо использовал. .NET взаимодействует с неуправляемым кодом повсюду. Тот факт, что утечка возникает в неуправляемом коде, не означает, что в вашем коде где-то нет проблемы с хранимой ссылкой. Если вы предоставите некоторые подробности того, почему вы считаете, что у вас есть проблема с утечкой памяти, и больше о вашем решении, возможно, мы можем предложить больше решений.