При запуске приложения .NET 2.0 WinForms в среде служб терминалов я вижу некоторые неожиданные результаты, которые я не могу полностью объяснить. Все, что я прочитал, указывало на то, что сборки JIT (то есть не использующие NGen для создания собственных изображений) приводят к тому, что все пространство кода сохраняется на личных страницах, что увеличивает размер рабочего набора / нагрузку на память. Однако фактические результаты (проверенные с помощью Process Explorer, VMMap и WinDbg) показывают, что даже сборки JIT действительно размещаются на разделяемых страницах (и действительно совместно используются, когда запущено несколько экземпляров приложения, даже под отдельными TS сессии / пользователей).
Может кто-нибудь объяснить, почему это может быть? Это выполняется в среде сервера W2K8, поэтому ASLR объясняет, почему отсутствие конкретных базовых адресов для каждой сборки и результирующий перебазирование не вызывают проблем. Тем не менее, кажется, тот факт, что это не собственные образы PE, должен привести к тому, что код для этих сборок будет храниться на личных страницах.
Это было обнаружено, когда мы начали исследовать использование NGen для уменьшения нагрузки на память, но на самом деле обнаружили, что он увеличил размер рабочего набора - поскольку сборки JIT уже были общими.
Самая последняя ссылка, которую я нашел, находится здесь, что опять-таки отличается от наших фактических результатов:
http://blogs.msdn.com/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx
Редактировать: Я должен добавить, что с момента первого опубликования вопроса больше экспериментов с тестовыми блоками Windows Server 2003 также, по-видимому, показывают, что JIT-сборки могут использоваться совместно между процессами. Я все еще в замешательстве относительно того, почему все советы, которые я могу найти, указывают на то, что NGen требуется, но все реальные данные противоречат этому. Я очень надеюсь, что эксперты здесь смогут пролить свет.
Спасибо!
Редактировать: Я вычистил все свои книги .NET / CLR и исчерпал идеи для поисковых запросов, чтобы попытаться решить эту проблему; кто собирается сделать мой день, помогая устранить это ужасное ноющее чувство "я не понимаю, что происходит"!?! :)