Использование памяти С#

Как я могу получить фактическую память, используемую в моем приложении С#?

  • Диспетчер задач показывает разные показатели.
  • 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, невозможно ответить.

Итак, что вы на самом деле хотите узнать? У вас есть конкретная проблема с производительностью?