Почему неуправляемая память занимает более 60% памяти, используемой консольным приложением?

Я профилирую использование памяти с помощью ANTS Memory Profiler 7.0 и заметил, что неуправляемое использование памяти составляет ~193 МБ (~62%) для консольного приложения, которое просто заполняет некоторые DTO из примерно 10 миллионов записей.

Текст справки для неуправляемой памяти гласит:

Память выделяется частям приложения, которые не работают как чистый код.NET. Это включает саму среду общего языка, графические буферы и любые неуправляемые данные, доступ к которым осуществляется через P/Invoke или COM+.

Почему эта цифра может быть такой высокой?

1 ответ

При доступе к базе данных вы неизбежно будете использовать неуправляемый код. Интерфейс к движку - это всегда код, который существует уже долгое время, предшествующий.NET и окруженный управляемыми классами, обеспечивающими взаимодействие. Это верно, скажем, для SQL Server и любого провайдера, который использует OleDb или ODBC.

Эти управляемые классы всегда будут реализовывать IDisposable, чтобы вы могли высвободить ресурсы, использованные нативным провайдером на ранних этапах. Забыть об этом очень часто и редко замечают. Кроме того, что процесс выглядит "тяжелым", он, по-видимому, потребляет много ручек и неуправляемую память без веской причины. Это особенно актуально, когда сборщик мусора запускается недостаточно часто, что можно увидеть с помощью Perfmon.exe. Таким образом, помимо использования Dispose, часть проблемы может заключаться в том, что вы еще недостаточно выполняете работу с этими объектами DTO, чтобы получить достаточно оттока GC.

Просмотрите ваш код и убедитесь, что вы используете Dispose() и оператор использования, где это необходимо.

Другие вопросы по тегам