2015-09-20 4 views
1

У меня есть приложение, которое занимает около 20 МБ оперативной памяти. В редко используемом алгоритме он (std :: vector) временно выделяет 250 МБ. После освобождения системный монитор все еще показывает это использование. Как я могу освободить память обратно в систему?Принудительное освобождение памяти ОС

+0

Зачем вам нужно его освободить? Разве ты не можешь просто оставить это? – jalf

+0

@jalf: Возможно, это связано с утечкой и другим программам не удается использовать эту память. Разумный вопрос, хотя бы потому, что он, очевидно, проистекает из заблуждения. –

+0

Является ли память, используемая непосредственно в векторе или направленная от объектов в векторе? Каждая версия распределителя по умолчанию имеет отсечку для отдельного размера блока, над которой распределение выполняется по-другому, поэтому освобождение происходит полностью обратно в ОС. Если 250 Мбайт были в одном гигантском куске (фактические объекты в векторе), тогда его выпуск должен перейти в ОС. Но если память используется меньше, ваши симптомы имеют больше смысла. – JSF

ответ

4

Вы не можете, и не должны.

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

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

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

+2

«Будьте уверены, если вы правильно освободили эту память, и ОС действительно нуждалась в ней, она будет переназначена». Это неверно. ОС не знает, что память была освобождена в процессе. ОС не имеет возможности копаться в процессе, когда хватает памяти. В лучшем случае ОС может менять эти страницы, занимая время и место подкачки. – JSF

4

Используйте mmap() или VirtualAlloc() для выделения и освобождения памяти. Это немедленно возвращает его в ОС.

Для использования с std :: vector, вам необходимо предоставить ему std :: allocator. Возможно, вам будет проще вручную раскрутить свой собственный вектор w/размещение нового и прямого вызова деструктора.

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

+1

Возврат его в ОС не гарантирует, что ОС решит удалить его из процесса. –

+0

С системными вызовами, которые я назвал, он делает. – Joshua

+0

Есть ли платформа для агностики для этого? – ManuelSchneid3r

Смежные вопросы