2011-02-06 3 views
4

Я прошу совета о том, чтобы доказать или развеять веру, которая содержится в моей команде (очевидно, без причины). Полагают, что запуск нового приложения .Net-приложения дорогостоящий по памяти (20 МБ и выше для процесса). Хотя я отмечаю, что приложение явно не так много использует (как видно из профилировщика памяти), они противоречат утверждению, что это не приложение, а среда исполнения .Net Framework, которая потребляет память.Стоимость нового .Net-процесса

Это основано на том, что они все слышали где-то, поэтому никаких твердых доказательств не существует, но убеждение чрезвычайно укоренилось в команде. Я googled вокруг, но я не могу найти какой-либо серьезный анализ затрат на обработку .Net Framework. Хотя я просто не могу согласиться с тем, что каждый .Net-процесс - это дорого (хотя я согласен признать, что, возможно, ошибаюсь в этом), я недостаточно знаю, чтобы доказать свою точку зрения. С другой стороны, мои товарищи по команде не знают достаточно, чтобы доказать, что я ошибаюсь. Кто-нибудь знает какие-либо исследования/анализ по этому вопросу?

спасибо.

+0

это, вероятно, несколько верно, см. Связанные потоки SO http://stackoverflow.com/questions/1343374/reducing-memory-usage-of-net-applications http://stackoverflow.com/questions/223283/net- exe-memory-footprint – BrokenGlass

+0

На самом деле это не связанные вопросы.Они обеспокоены сокращением стоимости самого приложения, выполняющего свою работу. Меня интересует стоимость CLR для каждого процесса (независимо от того, что делает приложение или как оно это делает). –

ответ

5

Ну, это все относительно. Процесс в Windows в целом является дорогостоящим ресурсом, но только если вы сравните его с операционной системой, такой как Unix. Обычные правила совместного использования ресурсов Windows действуют для управляемого процесса. Там будет только одна копия в физической памяти для кода в CLR, компиляторе JIT и любой сборке, которая является ngen-ed, которая включает в себя все сборки .NET framework. Диспетчер памяти Windows просто отображает одни и те же страницы во всех процессах, в которых используются эти DLL.

Что общего не является частным байтом, вы можете увидеть этот номер с помощью инструмента, такого как Process Explorer от SysInternal. Более крупные куски частных байтов в процессе .NET являются

  • мусорные кучи собрали
  • стеки, используемых нитей, по умолчанию 1 MB Кусочек
  • любые статические переменные, используемые в коде загружены в AppDomain
  • только что созданный код для сборок, которые не были определены
  • личные данные для CLR и джиттера.

Очевидно, что использование ngen.exe может значительно сократить количество личных байтов, если вы используете сборку более чем в одном процессе. AppDomain - это способ .NET снизить стоимость процесса и по-прежнему добиваться уровня изоляции, который широко используется в пользовательских хостах CLR, таких как ASP.NET и SQL Server. Если у вас есть возможность запускать код в потоке и запускать его в другом процессе, тогда поток всегда должен быть предпочтительным.

+0

Все эти вещи имеют смысл, но большинство из них - это затраты на приложение, выполняющее свою работу (первые 3 из ваших маркеров), а не стоимость CLR. То, что я пытаюсь найти, это различие между тем, как работать с тем же кодом, что и автономное приложение, или как связанная DLL в другом приложении. Это действительно 20 МБ и выше? В этом суть моего вопроса. Я действительно хотел бы, чтобы на этом был статистический/экспериментальный аналитический отчет. Я даже возьму спонсируемый MS :) –

+0

Не понимаю, почему вы думаете, что два случая разные. Они оба связаны с процессом, они оба требуют одинаковой поддержки времени выполнения, они оба требуют загрузки одного и того же фрагмента кода. Независимо от того, сохранен ли этот код в EXE или DLL, IL и метаданные не отличаются друг от друга. –

+0

Итак, вы говорите, что разница в потреблении памяти между двумя случаями равна нулю. Чтобы повторить повторение, мои товарищи по команде считают, что разница в размере не менее 20 МБ. –

3

Я только начал создавать консольные приложения .NET на своем ноутбуке всего лишь Console.ReadKey(). Это увеличило мою физическую память с 2,0 ГБ до 2,4 ГБ (у меня всего 6 ГБ, поэтому никакого напряжения памяти не произошло).

Это составляет 4 МБ за каждый процесс - вполне доступный, я бы сказал.

В любом случае, измерение потребления памяти под окнами и .NET на самом деле - это ракетостроение, так как существует множество разных типов памяти, которые при определенных обстоятельствах могут быть общими или нет.

+0

Спасибо за эксперимент :) Что касается комментария _rocket science_: вот почему я тайно надеялся, что кто-то сможет указать мне на блог MS/статью/документ по этому вопросу, который предоставил бы мнение по этому вопросу людьми, которые узнайте больше, чем мы, смертные о внутренних сетях .Net. –

Смежные вопросы