Использование памяти С#
Как я могу получить фактическую память, используемую в моем приложении С#?
- Диспетчер задач показывает разные показатели.
- Process Explorer показывает увеличенное использование частных байтов.
- Счетчик производительности (perfmon.msc) показал разные показатели
- Когда я использовал профилировщик .NET памяти, он показал, что большая часть памяти - сбор мусора и только несколько байтов Live.
Я не знаю, чему поверить.
Ответы
Ответ 1
Использование памяти несколько сложнее, чем отображение одного или двух цифр. Я предлагаю вам взглянуть на Mark Russinovich отличный пост на разные виды счетчиков в Windows.
.NET только усложняет ситуацию. Процесс .NET - это еще один процесс Windows, поэтому, очевидно, он будет иметь все регулярные показатели, но кроме того, CLR действует как менеджер памяти для управляемого приложения. Поэтому в зависимости от точки зрения эти цифры будут различаться.
CLR эффективно распределяет и освобождает виртуальную память в больших кусках от имени приложения .NET, а затем при необходимости извлекает биты памяти в приложение. Таким образом, хотя ваше приложение может использовать очень мало памяти в данный момент времени, эта память может быть или не быть выпущена в ОС.
Кроме того, CLR сама использует память для загрузки IL, компиляции IL в собственный код, хранения всей информации о типе и т.д. Все это увеличивает объем памяти процесса.
Если вы хотите знать, сколько памяти используется вашим управляемым приложением для данных, полезно использовать байты во всем счетчике кучи. Частные байты могут использоваться в качестве приблизительной оценки использования памяти приложения на уровне процесса.
Вы также можете проверить эти связанные вопросы:
Сокращение использования памяти приложениями .NET?
Как определить, где находится утечка памяти?
Ответ 2
Если вы используете VS 2010, вы можете использовать Visual Studio 2010 Profiler.
Этот инструмент может создавать для вас очень информативные отчеты.
Ответ 3
Если вы хотите узнать приблизительно, сколько байтов выделено в куче GC (игнорируя память, используемую средой выполнения, JIT-компилятором и т.д.), вы можете вызвать GC.GetTotalMemory. Мы использовали это при отслеживании утечек памяти.
Ответ 4
Загрузить VADump (Если у вас его еще нет)
Использование: VADUMP.EXE -sop [PID]
Ответ 5
Ну, что такое "фактическая память, используемая в моем приложении С#"?
Благодаря виртуальной памяти и (нескольким) уровням управления памятью в Windows и CLR это довольно сложный вопрос.
Из источников, которые вы упоминаете, профайлер CLR даст вам самую подробную разбивку, я бы назвал это наиболее точным.
Но ответа "одного номера" нет, вопрос о том, может ли приложение A использовать более или менее память, чем B, невозможно ответить.
Итак, что вы на самом деле хотите узнать? У вас есть конкретная проблема с производительностью?