Можно ли уменьшить рабочий набор управляемого приложения, выгружая неуправляемые библиотеки с AfxFreeLibrary?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть управляемое приложение Windows, которое загружает управляемый компонент C ++, который использует AfxLoadLibrary для загрузки стороннего компонента, если он присутствует на клиентском компьютере. После обнаружения я выгружаю компонент с помощью AfxFreeLibrary, пытаясь уменьшить рабочий набор управляемого родительского приложения.

Вызов AfxFreeLibrary выполнен успешно (проверено с помощью Process Explorer), но память не освобождена. Это связано с природой управляемого приложения или есть способ освободить это пространство процесса?

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

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

Решение

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

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

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

Единственный способ уменьшить рабочий набор - использовать ваше приложение меньше памяти. Поскольку это приложение .NET, скорее всего, вы совсем не контролируете его (поскольку GC решит, сколько памяти «активно» и нужно в рабочем наборе)

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