У меня есть приложение, которое занимает около 20 МБ оперативной памяти. В редко используемом алгоритме он (std :: vector) временно выделяет 250 МБ. После освобождения системный монитор все еще показывает это использование. Как я могу освободить память обратно в систему?Принудительное освобождение памяти ОС
ответ
Вы не можете, и не должны.
Распределение виртуальной памяти сложное и не может быть достаточно понято простым просмотром номера в системном мониторе. Может показаться, что процесс использует больше памяти, чем должен, но это всего лишь артефакт того, как работает адресация виртуальной памяти.
Будьте уверены, если вы правильно освободили эту память и операционная система действительно нуждалась в ней, она будет переназначена.
Единственный реальный момент в действии - прекратить использование системного монитора, как если бы это была точная мера физической памяти, используемой вашим процессом!
«Будьте уверены, если вы правильно освободили эту память, и ОС действительно нуждалась в ней, она будет переназначена». Это неверно. ОС не знает, что память была освобождена в процессе. ОС не имеет возможности копаться в процессе, когда хватает памяти. В лучшем случае ОС может менять эти страницы, занимая время и место подкачки. – JSF
Используйте mmap() или VirtualAlloc() для выделения и освобождения памяти. Это немедленно возвращает его в ОС.
Для использования с std :: vector, вам необходимо предоставить ему std :: allocator. Возможно, вам будет проще вручную раскрутить свой собственный вектор w/размещение нового и прямого вызова деструктора.
Обычно распределители кучи системы обрабатывают это правильно для вас; однако похоже, что вы нашли случай, когда они этого не делают.
Возврат его в ОС не гарантирует, что ОС решит удалить его из процесса. –
С системными вызовами, которые я назвал, он делает. – Joshua
Есть ли платформа для агностики для этого? – ManuelSchneid3r
- 1. Освобождение памяти
- 2. Освобождение памяти обратно в ОС при запуске JVM
- 3. Распределение памяти и освобождение памяти
- 4. UNIX vs Освобождение памяти Windows
- 5. cv :: Распределение памяти памяти и освобождение памяти
- 6. Освобождение выделенной памяти
- 7. Освобождение памяти C++
- 8. освобождение выделенной памяти
- 9. Выход и освобождение памяти
- 10. Освобождение памяти и исключения
- 11. Освобождение памяти CUDA Matlab
- 12. Освобождение памяти QList
- 13. KnockoutJS Освобождение памяти
- 14. dapper.net освобождение кэшированной памяти
- 15. Освобождение памяти в функции
- 16. NewStringUTF() и освобождение памяти
- 17. освобождение памяти Java
- 18. Освобождение памяти (если возможно)
- 19. Освобождение памяти перед перераспределением
- 20. Освобождение памяти объекта
- 21. Освобождение памяти от переменных
- 22. Освобождение памяти Valgrind
- 23. Освобождение памяти после использования
- 24. Освобождение памяти без кучи
- 25. Освобождение памяти в R
- 26. ARC и освобождение памяти
- 27. Освобождение динамической памяти
- 28. Как проверить освобождение памяти
- 29. JNI освобождение памяти
- 30. Освобождение выделенной памяти
Зачем вам нужно его освободить? Разве ты не можешь просто оставить это? – jalf
@jalf: Возможно, это связано с утечкой и другим программам не удается использовать эту память. Разумный вопрос, хотя бы потому, что он, очевидно, проистекает из заблуждения. –
Является ли память, используемая непосредственно в векторе или направленная от объектов в векторе? Каждая версия распределителя по умолчанию имеет отсечку для отдельного размера блока, над которой распределение выполняется по-другому, поэтому освобождение происходит полностью обратно в ОС. Если 250 Мбайт были в одном гигантском куске (фактические объекты в векторе), тогда его выпуск должен перейти в ОС. Но если память используется меньше, ваши симптомы имеют больше смысла. – JSF