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

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

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

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

Ответы на вопрос(5)

Решение Вопроса

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

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

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

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

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

Вы также можете проверить эти вопросы:

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

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

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

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

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

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

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

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

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

 L.E.25 июл. 2013 г., 02:27
этот ответ должен быть сверху. Профилировщик помогает, но дорого его получить.
 Brian Rasmussen27 сент. 2010 г., 12:51
Имейте в виду, что профилировщик доступен только в более дорогих версиях VS.
 atamanroman27 сент. 2010 г., 13:53
Вам нужно VS 2010 Premium или выше (что странно, win7 prof >> home prem, а vs2010 prem >> vs2010 prof)
 bahadir arslan27 сент. 2010 г., 12:56
да @ Брайан Расмуссен прав. Я думаю, что только VS Ultimate поддерживает Profiler.

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

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

Ваш ответ на вопрос