Что такое утилизация Appdomain? - PullRequest
       30

Что такое утилизация Appdomain?

42 голосов
/ 01 сентября 2008

Я пытаюсь выяснить, что именно представляет собой утилизацию Appdomain? Когда впервые запрашивается страница aspx из приложения DotNet, я понимаю, что домен приложения для этого приложения создан, и необходимые сборки загружены в этот домен приложения, и запрос будет обработан. Теперь, если файл web.config или содержимое папки bin и т. Д. Будут изменены, домен приложения будет "переработан". Мой вопрос заключается в том, будет ли в конце процесса утилизации домен приложения загружен сборками и готов к обслуживанию следующего запроса? или необходимо запросить страницу для запуска загрузки сборок?.

Ответы [ 4 ]

64 голосов
/ 13 апреля 2011

Ну, я думаю, что нить гладко подходила к окончательному выводу, но в итоге все было иначе.

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

Прежде всего, я сам стараюсь избегать термина recycle, отличного от «Пулы приложений», поскольку это может привести кого-то в замешательство. Теперь, добравшись до процесса, пулов и AppDomain, я вижу картинку следующим образом:

Пул приложений, короче говоря, является областью памяти, которая поддерживается и выполняется процессом, называемым W3WP.exe, или Рабочим процессом. Рециркуляция пула приложений означает остановку этого процесса, удаление его из памяти и создание нового рабочего процесса с новым назначенным идентификатором процесса.

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

Когда дело доходит до утилизации, как я изначально говорил, это то, что я сам резервирую только для пулов приложений. Для доменов приложений я предпочитаю использовать термин «перезапуск», чтобы избежать неправильного представления. Исходя из этого, перезапуск AppDomain означает запуск поверх данного приложения с вновь добавленными настройками, например обновление существующей конфигурации. Это происходит в границах этого подрегиона памяти, называемого AppDomain, который в конечном итоге находится в процессе, связанном с соответствующим пулом приложений. Эти новые настройки могут быть получены из файлов, таких как

web.config, machine.config, global.asax, Бин каталог, App_Code,

и могут быть другие.

AppDomain изолированы друг от друга, что имеет смысл. Если это не так, если изменения в файле web.config, скажем, приложения 1, требуют повторного использования пула, все другие приложения, назначенные этому пулу, будут перезапущены, что определенно нежелательно ни Microsoft, ни кем-либо еще.

Обобщая мою точку зрения,

  • Процесс (W3WP.exe)
    • AppDomain 1
    • AppDomain 2
    • AppDomain 3
    • AppDomain n

n = количество назначенных приложений в пул приложений, управляемый данным W3WP.exe

  • Процессы - это области памяти, изолированные друг от друга
  • Домены приложений - это области вспомогательной памяти, изолированные друг от друга в рамках одного процесса
  • Глобальные изменения настроек IIS могут потребовать перезапуска пула приложений (уничтожение и запуск нового рабочего процесса, W3WP.exe)
  • Настройки всего приложения изменяют проблемы доменов приложений, и они могут быть перезапущены после изменений в некоторых конкретных файлах, таких как приведенные выше

Для получения дополнительной информации, я рекомендую:

http://blogs.msdn.com/b/david.wang/archive/2006/03/12/thoughts-on-iis-configuration-changes-and-when-it-takes-effect.aspx

Что вызывает перезапуск пула приложений в IIS?

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx

С уважением, из Бразилии!

7 голосов
/ 01 сентября 2008

Взгляните на это - это может объяснить это:

http://weblogs.asp.net/owscott/archive/2006/02/21/ASP.NET-v2.0-2D00-AppDomain-recycles_2C00_-more-common-than-before.aspx#440333

В общем. То, что называется «первым попаданием» на веб-сайт ASP.NET, обычно занимает больше времени из-за компиляции и создания домена приложения.

При каждом развертывании сайта - обязательно используйте функцию «Опубликовать сайт» в Visual Studio, чтобы предварительно скомпилировать ваш сайт. Затем штраф за «первый удар» уменьшается. И не забудьте установить конфигурацию Release, а не Debug!

2 голосов
/ 02 сентября 2008

Recycle завершает процесс, на котором размещается домен приложения. Вы заметите, что PID меняется, когда вы перерабатываете его.

Выгрузка AppDomin просто выгружает все сборки в AppDomain, которые затем можно использовать повторно.

Важно помнить, что после загрузки CLR в процесс его нельзя удалить. Так что если вам нужно было что-то сделать, как только загрузится CLR, то простая выгрузка домена приложения не поможет, потому что CLR не будет перезагружен.

Кроме того, IIS - не единственный процесс, который может размещать домен приложений - любой процесс может это сделать, и вы не всегда хотите завершать весь процесс только для выгрузки своих сборок.

1 голос
/ 02 сентября 2008

Если ваши страницы «обновляемые», они должны быть скомпилированы перед использованием. Это означает, что да, при первом запросе сборки загружаются, компилируются и готовятся к доступу. Всякий раз, когда эти файлы изменяются (даже некоторые вирусные программы могут вызывать это, изменяя дату изменения файлов!), Домен приложения перерабатывается.

Вы можете настроить свое веб-приложение так, чтобы оно не обновлялось. Все скомпилировано в DLL, и вы не увидите никаких файлов .ASPX или .CS в виртуальном каталоге. Это усложняет обновление вашего кода (необходимо добавить дополнительный текст на веб-страницу? Время перекомпиляции!), Но увеличивает доступность вашего веб-приложения.

Однако это по-прежнему не предотвратит перезапуск вашего веб-приложения, если какой-либо из файлов будет изменен. Например, если вы редактируете web.config, ваш домен приложения будет перезагружен, даже если он скомпилирован.

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