none
Потребление памяти dll приложения после выполнения crossgen RRS feed

  • Вопрос

  • Добрый вечер!
    Имеется терминальный сервер. Для 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=sharing
    1 апреля 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