Спрашивающий
Потребление памяти dll приложения после выполнения crossgen

Вопрос
-
Добрый вечер!
Имеется терминальный сервер. Для dll приложения был выполнен crossgen.
После выполнения crossgen при первом запуске приложения для данной dll выделяется адрес в памяти, у других экземпляров запущенного приложения данный адрес остется как у dll первого экземпляра.
Однако, каждый из экземпляров по прежнему расходует обем памяти, как если бы crossgen не выполнялся.
В каждом из экземпляров данная dll так же расходует память.
Пояните, пожалуйста, почему так происходит и почему у других экземпляров расход памяти данной dll не равен нулю?
Скриншот экземпляра №1: https://drive.google.com/file/d/1gam6Q-KyUbQh-4mwUs0JE1Qour4LI5Q9/view?usp=sharing
Скриншот экземпляра №2: https://drive.google.com/file/d/1wDb-NHFQzBXUor8FvwIHFISXca2r_Hsq/view?usp=sharing1 апреля 2021 г. 14:42
Все ответы
-
Вы о расходе памяти под собственно код из DLL (который в настоящее время обычно ни на что не влияет) или о расходе памяти которая выделяется в процессе работы?
Пример: DLL размером 1 МБ обрабатывает изображения.
Запущено 10 процессов, выделено:
- 10 * 1 МБ под код из DLL.
- 10 * 100 МБ под изображения (все разные).
Итого используется около 1 ГБ.
Делаем "crossgen":
- 1 * 1 МБ под код из DLL.
- 10 * 100 МБ под изображения (все разные).
Итого используется около 1 ГБ.
Заметили разницу?
This posting is provided "AS IS" with no warranties, and confers no rights.
1 апреля 2021 г. 16:39 -
Про память, которая выделяется на изображения - понятно.
Согласно Вашему примеру, на втором скриншоте (у второго экземпляра) потребление памяти у dll должно быть минимизировано, а это не так. Поясните, пожалуйста, почему так произошло.
Тестовое приложение в моем вопросе - пустая форма без обработчиков.У нас есть работающее приложение со множеством dll, которое запускается в нескольких экземплярах на терминальных серверах. Хотим на него применить данную технологию, чтобы освободить часть занимаемой памяти.
2 апреля 2021 г. 10:17 -
Про память, которая выделяется на изображения - понятно.
Согласно Вашему примеру, на втором скриншоте (у второго экземпляра) потребление памяти у dll должно быть минимизировано, а это не так. Поясните, пожалуйста, почему так произошло.
Тестовое приложение в моем вопросе - пустая форма без обработчиков.У нас есть работающее приложение со множеством dll, которое запускается в нескольких экземплярах на терминальных серверах. Хотим на него применить данную технологию, чтобы освободить часть занимаемой памяти.
Это вообще то совсем не простая тема, много тонкостей и я всех ответов не знаю.
Но несколько вопросов:
- Вы смотрите на физическую память (это которая "освободится") или виртуальную (которая не изменится)?
- Как на счет ASLR?
- Сгенерированный код имеет флаг IMAGE_SCN_MEM_SHARED в секции кода?
Я вам порекомендую задать данный вопрос в форумах MSDN. Лучше в англоязычных так как там на ~три порядка больше посетителей.
Так же возможно стоит потренироваться на родной DLL с разными флагами ASLR в том числе. Если выйдет "сэкономить", то дальше можно смотреть разницу с генерированной DLL.
This posting is provided "AS IS" with no warranties, and confers no rights.
2 апреля 2021 г. 16:46