Стоимость нового .Net процесса - PullRequest
4 голосов
/ 06 февраля 2011

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

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

Спасибо.

Ответы [ 2 ]

5 голосов
/ 06 февраля 2011

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

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

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

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

3 голосов
/ 06 февраля 2011

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

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

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

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