Использование памяти C # - PullRequest
       5

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

13 голосов
/ 27 сентября 2010

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

  • Диспетчер задач показывает разные метрики.
  • Process Explorer показывает увеличение использования частных байтов.
  • Счетчик производительности (perfmon.msc) показал разные показатели
  • Когда я использовал профилировщик памяти .NET, он показал, что большая часть памяти собирается мусором и только несколько живых байтов.

Я не знаю, во что верить.

Ответы [ 5 ]

11 голосов
/ 27 сентября 2010

Использование памяти несколько сложнее, чем отображение одного или двух чисел.Я предлагаю вам взглянуть на превосходный пост Марка Руссиновича о различных видах счетчиков в Windows.

.NET только еще больше усложняет ситуацию.Процесс .NET - это просто еще один процесс Windows, поэтому, очевидно, он будет иметь все обычные метрики, но в дополнение к этому CLR выступает в качестве диспетчера памяти для управляемого приложения.Так что в зависимости от точки зрения эти цифры будут различаться.

Среда CLR эффективно выделяет и освобождает виртуальную память большими порциями от имени приложения .NET, а затем при необходимости передает биты памяти приложению.Таким образом, в то время как ваше приложение может использовать очень мало памяти в данный момент времени, эта память может быть или не быть освобождена для ОС.

Кроме того, сам CLR использует память для загрузки IL, компиляции IL в собственный код, хранения всей информации о типах и так далее.Все это увеличивает объем используемой памяти.

Если вы хотите узнать, сколько памяти ваше управляемое приложение использует для данных, счетчик байтов во всех кучах полезен.Частные байты могут использоваться в качестве приблизительной оценки использования памяти приложением на уровне процесса.

Вы также можете проверить следующие связанные вопросы:

Сокращение использования памяти приложениями .NET?

Как определить, гдеУтечка памяти есть?

2 голосов
/ 27 сентября 2010

Если вы хотите приблизительно узнать, сколько байтов выделено в куче GC (без учета памяти, используемой средой выполнения, JIT-компилятором и т. Д.), Вы можете вызвать GC.GetTotalMemory .Мы использовали это для отслеживания утечек памяти.

2 голосов
/ 27 сентября 2010

Если вы используете VS 2010, вы можете использовать Visual Studio 2010 Profiler. Этот инструмент может создавать очень информативные отчеты для вас.

1 голос
/ 27 сентября 2010

Ну, а что такое "фактическая память, используемая в моем приложении C #"?

Благодаря виртуальной памяти и (нескольким) слоям управления памятью в Windows и CLR, это довольно сложный вопрос.

Из источников, которые вы упомянули, профилировщик CLR даст вам наиболее подробную разбивку, я бы назвал это наиболее точным

Но ответа «одно число» не существует, вопрос о том, использует ли приложение A больше или меньше памяти, чем B, может быть невозможным.

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

1 голос
/ 27 сентября 2010

Скачать VADump (если у вас его еще нет)

Использование: VADUMP.EXE -sop [PID]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...