Восстановить память после выхода из программы - PullRequest
4 голосов
/ 25 августа 2011

Вот моя проблема: после запуска набора программ, free говорит мне, что после выполнения осталось около 1 ГБ свободной памяти. После некоторых поисков я обнаружил SO: Что действительно происходит, когда вы не освобождаетесь после malloc , который (насколько я понимаю) ясно дает понять, что отсутствие освобождения памяти не должно быть проблемой ... (это правильно?)

top не показывает никаких процессов, которые используют значительные объемы памяти.

Как я могу узнать 'что произошло' в памяти, то есть какая программа распределила его и почему она не свободна после выполнения программы?

Где free собирает информацию?

(у меня установлена ​​последняя версия Ubuntu)

Ответы [ 3 ]

4 голосов
/ 25 августа 2011

Да, память, используемая вашей программой освобождается после выхода из программы.

Статистика в «свободном» сбивает с толку, но факт в том, что память доступна другим программам:

http://kevinclosson.wordpress.com/2009/11/17/linux-free-memory-is-it-free-or-reclaimable-yes-when-i-want-free-memory-i-want-free-memory/

http://sourcefrog.net/weblog/software/linux-kernel/free-mem.html

Вот лучшая ссылка на событие:

http://www.linuxatemyram.com/

2 голосов
/ 25 августа 2011

free (1) является неправильным, его правильнее назвать unused, потому что это то, что он показывает. Или, может быть, он должен называться physicalfree (или, точнее, «свободный» столбец в выходных данных должен называться «неиспользованный»).
Вы заметите, что «buffers» и «cached» имеют тенденцию увеличиваться, а «free» - понижаться. Память не исчезает, она просто назначается другому «ведру».

Разница между свободной и неиспользуемой памятью заключается в том, что, хотя обе являются «свободными», неиспользуемая память действительно такова (физическая память не используется), тогда как просто «свободная» память часто перемещается в буферный кеш. Это, например, случай для всех исполняемых образов и библиотек, всего, что доступно только для чтения или для чтения и выполнения. Если тот же файл загружается снова позже, «свободная» страница снова отображается в процессе, и данные не должны загружаться.

Обратите внимание, что "неиспользованный" на самом деле плохая вещь, хотя это не сразу очевидно (звучит хорошо, не так ли?). Свободная (но физически используемая) память служит цели, тогда как свободная (неиспользуемая) память означает, что вы могли бы также сэкономить на оперативной памяти. Поэтому неиспользуемая память (например, путем очистки страниц) - это именно то, что вам не нужно.
Потрясающе, под Windows существует множество инструментов «оптимизатора памяти», которые стоят реальных денег и которые делают именно это ...

Что касается восстановления памяти, способ, которым это работает, прост: ОС просто удаляет ссылки на все страницы в рабочем наборе. Если страница используется другим процессом, ничего особенного не происходит. Если он принадлежит неанонимному отображению и недоступен для записи (или записи и не записан ), он попадает в буферный кэш. В противном случае это пойдет наперекосяк.
При этом удаляется вся память, выделенная с помощью malloc, а также память, используемая исполняемыми файлами и сопоставлениями файлов, и (поскольку вся память основана на страницах) все остальное.

0 голосов
/ 25 августа 2011

Вероятно, ваша ОС использует это пространство для своих собственных целей.

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

Загрузка ЦП работает аналогичным образом.Часто ваша ОС будет спекулятивно выполнять некоторую работу, когда процессор в противном случае будет «простаивать».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...