free (1)
является неправильным, его правильнее назвать unused
, потому что это то, что он показывает. Или, может быть, он должен называться physicalfree
(или, точнее, «свободный» столбец в выходных данных должен называться «неиспользованный»).
Вы заметите, что «buffers» и «cached» имеют тенденцию увеличиваться, а «free» - понижаться. Память не исчезает, она просто назначается другому «ведру».
Разница между свободной и неиспользуемой памятью заключается в том, что, хотя обе являются «свободными», неиспользуемая память действительно такова (физическая память не используется), тогда как просто «свободная» память часто перемещается в буферный кеш. Это, например, случай для всех исполняемых образов и библиотек, всего, что доступно только для чтения или для чтения и выполнения. Если тот же файл загружается снова позже, «свободная» страница снова отображается в процессе, и данные не должны загружаться.
Обратите внимание, что "неиспользованный" на самом деле плохая вещь, хотя это не сразу очевидно (звучит хорошо, не так ли?). Свободная (но физически используемая) память служит цели, тогда как свободная (неиспользуемая) память означает, что вы могли бы также сэкономить на оперативной памяти. Поэтому неиспользуемая память (например, путем очистки страниц) - это именно то, что вам не нужно.
Потрясающе, под Windows существует множество инструментов «оптимизатора памяти», которые стоят реальных денег и которые делают именно это ...
Что касается восстановления памяти, способ, которым это работает, прост: ОС просто удаляет ссылки на все страницы в рабочем наборе. Если страница используется другим процессом, ничего особенного не происходит. Если он принадлежит неанонимному отображению и недоступен для записи (или записи и не записан ), он попадает в буферный кэш. В противном случае это пойдет наперекосяк.
При этом удаляется вся память, выделенная с помощью malloc
, а также память, используемая исполняемыми файлами и сопоставлениями файлов, и (поскольку вся память основана на страницах) все остальное.