2008-09-16 3 views
3

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

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

ответ

1

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

1

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

1

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

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

0

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

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

НТН, Erich

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