Плохо ли загружать множество управляемых DLL, не используя в них какие-либо типы?

StackOverflow https://stackoverflow.com/questions/70098

Вопрос

Фон:В моей компании мы разрабатываем множество приложений, которые используют одни и те же основные библиотеки DLL.Эти dll используют IoC-контейнер Spring.net для подключения (автоматическое подключение).Все приложения используют один и тот же файл конфигурации Spring, и этот файл конфигурации указывает на множество классов в разных DLL.Но не всем приложениям нужна функциональность каждой dll.Но из-за особенностей работы IoC-контейнеров все библиотеки dll загружаются для Spring.net, чтобы проверить типы, какие интерфейсы они реализуют и так далее.

Основной вопрос:Я понимаю, что лучше просто загрузить те dll, которые вы действительно используете.Но действительно ли загрузка управляемой библиотеки DLL вредна для использования памяти?Или сначала вы используете классы в dll, и они получают JIT-компиляцию, чтобы использовать большую часть памяти?

Это было полезно?

Решение

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

Другие советы

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

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

Однако следует иметь в виду: как только вы загрузите сборку в домен приложения, вы не сможете затем выгрузить ее из этого домена приложения, однако возможно динамически создавать домены приложений, загружать в них сборки и выгружать весь домен приложения, когда вы сделанный.

конечно, загрузка dll без их использования приводит к замедлению времени запуска из-за чтения сборки с диска и проверок доказательств/безопасности.Но если вас беспокоит память, вы, по крайней мере, можете быть уверены: вы не потратите больше памяти, чем размер ваших сборок, если вы действительно не используете какие-либо типы внутри.Конечно, если эти типы указаны в конфигурации Spring, по крайней мере эти типы загружаются в память, и их статический инициализатор (если таковой имеется) будет выполнен.В редких случаях это может быть проблемой.JIT-компиляция выполняется CLR для каждого метода, поэтому методы, которые вы не используете, не будут тратить ресурсы процессора и памяти.

В любом случае вы можете разделить файлы конфигурации на разделы, например.поместив все определения объектов модуля A в файл ModuleA.config, все определения модуля B в файл ModuleB.config и указав только те модули для вашего конкретного приложения, которые действительно необходимы.

HTH, Эрих

P.S.:Я также хотел бы предложить вам опубликовать соответствующие вопросы о Spring для .NET на нашем сайте. форумы сообщества - там больше шансов получить ответы на свои вопросы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top