Управление памятью при загрузке сборки с использованием отражения - PullRequest
2 голосов
/ 04 ноября 2011

Все,

Я создаю компонент, который использует составной шаблон.Основной компонент использует метаданные XMl для определения композитов (частей).во время выполнения основной компонент будет использовать отражение, чтобы загрузить сборку детали в память и вызвать методы (например, метод IPart.execute).

Теперь мой вопрос

1) будет (динамическая) память, которая занята сборкой, загруженной с использованием отражения, будет выгружена, когда я удаляю объект или нет.

2), если он не выгружает и не освобождает память, есть ли способ, которым я могуудалите его из памяти.

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

Благодарю Альберта Арула Пракаша

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Я видел, как люди загружали дополнительные библиотеки через отражение (мы могли бы назвать эти библиотеки "плагинами") в другом домене приложения. Например, см. Эту статью: http://adrianvintu.com/blogengine/post/Unloadable-plugins.aspx

Таким образом, вы защищены от «злых» плагинов, а также память может управляться в таком домене приложений (когда домен приложения выгружается, память также освобождается)

0 голосов
/ 04 ноября 2011

Есть две вещи, которые могут потреблять память в плагине / модуле.Грубо говоря, это код (загрузка сборки в пространство процесса занимает память) и объекты (создание экземпляра чего-либо потребляет память).

будет (динамическая) память, занятаясборка, которая загружается с использованием отражения, будет выгружена, когда я удалю объект или нет.

Вызов Dispose на IDisposable ничего не делает с объектом, если речь идет о памяти.Он может освободить ресурсы, которые использует объект (например, если вы закроете файл, он избавится от открытых файловых дескрипторов), но он не освободит сам объект.IDisposable не волшебная функция освобождения памяти - это просто метод интерфейса, который позволяет объекту понять, что он должен избавиться от ресурсов, которыми он владеет.

Чтобы освободить сам объект, выдолжен избавиться от всех ссылок на него (возможно, установить для них значение null или позволить им выпасть из стека вашей программы), и сборщик мусора должен в конечном итоге запустить эту память.

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

Если вас интересуют только такие ресурсы, как GUI и файловые дескрипторы, обязательно вызовите Dispose.Вы всегда должны делать это:)

Если вас беспокоит память объекта, просто позвольте GC выполнить свою работу.Не надо приставать к этому.Пусть он работает сам по себе.

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

См. ответ наивистов для получения информации об использовании подпрограммы AppDomain.

...