Windows 7 жрет память. Так ли это плохо?
Давайте посмотрим, насколько эти наезды на программистов Майкрософт обоснованы.
🕛 28.04.2010, 11:14
В интернете мне доводилось слышать большое число гневных комментариев в стиле "Да Windows 7 - полный отстой! Вы посмотрите, как она жрет память!" В подтверждение приводятся вроде того, что ниже, и снова - все списывается на "криворуких индусских программистов". Предположим, вы приобрели компьютер с 8 гигабайтами памяти. Однако неужели то, что применяется от силы 1 гигабайт, а вся остальная память простаивает - так уж неплохо? С выходом Виста и Windows 7 подход к применению оперативной памяти радикально поменялся: сейчас ОС пробует применять всю имеющуюся память в максимальной степени эффективно. В т.ч., в Виста и Windows 7 возникла фича с названием SUPERFETCH.
Что же такое SUPERFETCH?
SUPERFETCH - системный сервис, запускающийся внутри системного процесса svchost. Код его располагается внутри DLL-ки %SYSTEMROOT%\System32\Sysmain.dll. Этот сервис всегда следит за тем, какие приложения запускает пользователь, и к каким исполняемым файлам и файлам данных они обращаются. Вся эта информация сохраняется в файлах с расширением *.db в каталоге %SYSTEMROOT%\Prefetch. Для чего это все делается? А вот для чего: сервис SUPERFETCH, имея информацию о том, с какими приложениями пользователь работает чаще всего - заблаговременно подгружает в память соответствующий код и данные, и, когда пользователь запускает свое приложение - вся нужная информация уже есть в памяти, и запуск случается гораздо скорее - так как нет потребности считывать информацию с жесткого диска. В особенности это заметно на этих "тяжелых" приложениях, как семейство MS Office, функционал которых может оказаться "размазан" по десяткам и сотням exe-шников и dll-ок. SUPERFETCH так "умна", что может даже определять предпочтения пользователя в различные дни и время дня - к примеру, то, что в рабочие дни он работает с Word и Excel, а по выходным - играется в Call of Duty, и, соответственно - подгружает в память необходимые данные. Соответственно, эта область памяти помечается как "занятая", что и показывается в Task Manager'e, создавая впечатление "утечек памяти". Так или иначе, если вдруг запускается какое-то приложение, требующее выделения памяти - memory manager спокойно освобождает необходимое пространство, а по завершении работы приложения память высвобождается и данные подгружаются вновь.Если же какое-либо приложение, например, завершает собственную работу и освобождает память - то SUPERFETCH обращается к менеджеру памяти с просьбой подгрузить лишь что выгруженный код и даннные. Процесс этот случается с маленькой скоростью и с низшим (Very Low) приоритетом, потому работа SUPERFETCH не приводит к падению производительности. Если вы, например, отойдете покурить, а в это время запустится фоновый процесс, которому необходима память (к примеру - антивирусная проверка), то код и данные приложения, с которым вы работали - вероятно будут выгружены из памяти. Благодаря же SUPERFETCH - к тому моменту, когда вы вернетесь с перекура - данные вашего активного приложения будут целиком или отчасти подгружены обратно в память.
Помимо того, SUPERFETCH может обрабатывать режимы гибернации, "спящий режим" и смены пользователя (fast user switching). Например, если система уходит в гибернацию - то SUPERFETCH сохраняет в файл hiberfil.sys код и данные тех приложений, которые, по его мнению, вероятнее всего будут применяться после выхода из гибернации. Как это "мнение" формируется? Весьма просто - Огромной БратSUPERFETCH глядит за тобой, и за тем, что ты запускал после выхода из прошлых гибернаций, и основываясь на этом - может предположить, что в другой раз при выходе из гибернации ты скорее всего запустишь "аську" и откроешь собственный любимый броузер, чтоб почитать "хабрахабр". Ну а ч/з часок-иной - откроешь Visual Studio, так как проект горит, а сроки сдачи - "вчера".
Возможно понаблюдать за работой SUPERFETCH при помощи того же Task Manager'a
Если какое-то время поюзать Виста/7, то возможно заметить, что объем свободной памяти уменьшается. Это случается из-за того, что SUPERFETCH стандартный систмный кэш Windows пытаются утилизировать доступную память для кэширования данных с диска. Например, если тут же после загрузки Windows запустить Task Manager - видно, что Free Memory - уменьшается, а Cached Memory - наоборот растет. Если же запустить какую-нибудь "жадную до памяти" программу, или же просто запустить копирование крупного файла - Free Memory увеличится и график "Physical Memory Usage" резко упадет, так как система будет освобождать память для запущенного приложения, однако позже начнет потихоньку расти - так как собственно приложение начнет эту память забирать. Хотя, с течением времени SUPERFETCH будет подгружать в память не слишком давно выгруженные данные, потому значение Cached Memory будет расти, а Free Memory - уменьшаться.
Надеюсь, было любопытно. Спасибо за внимание. Вопросы и матюки - велком в каменты.