Подмена, по-видимому, произошла, когда неактивные страницы ОЗУ были фактически активны
( Обновление: как было разъяснено в комментарии, это не ваш случай. Поэтому люди с такой же проблемой могут перейти к горизонтальному правилу .)
Т.е. у вас было запущено много программ и ядро выкачало некоторые страницы. Затем вы вышли из некоторых программ. Ядро помечает их страницы ОЗУ как неактивные. Но он не поменяет страницы обратно в оперативную память, пока эти страницы не понадобятся. Это приводит к наличию как неактивных, так и замененных страниц.
Почему бы не превентивно менять страницы? Потому что это будет пари против шансов: в долгосрочной перспективе вы проиграете. Давайте подумаем об упрощенном примере: две программы A и B, которые не помещаются в ОЗУ одновременно. Программа A все еще работает, и все выгруженные страницы принадлежат A. Программа B завершила работу, а все неактивные страницы принадлежат B.
Если ядро предварительно меняет страницы А и сразу после:
- Программа А должна получить доступ к своим страницам -> Вы выиграли - страницы уже находятся в ОЗУ.
- Вы снова запускаете B -> Вы теряете - вы «заплатили» за доставку страниц в оперативную память, и теперь вы должны отправить их обратно.
- Вы запускаете другую программу C -> Вы проигрываете, если A и C не помещаются в ОЗУ одновременно. Если они подходят, вы даже.
Также учтите, что замена (запись на диск) обходится дороже, чем замена (чтение с диска). Что делает эту «ставку» еще более непривлекательной.
Короче говоря: доверяйте своему ядру и не пытайтесь перехитрить его.
Обновление:
выясняется, что неактивная память не работает, так как Использование Activity Monitor для чтения статьи System Memory заставило многих поверить, что она работает. В статье дано правильное определение неактивной памяти:
Эта информация находится в оперативной памяти, но она не используется активно, она использовалась недавно.
Но следующий пример полностью вводит в заблуждение и чрезмерно упрощает (как мой пример, чтобы быть откровенным):
Например, если вы используете Почту, а затем выходите из нее, ОЗУ, которое использовала Почта, помечается как Неактивная память. Неактивная память доступна для использования другим приложением, как и Свободная память. Однако если вы откроете Mail до того, как его неактивная память будет использоваться другим приложением, Mail откроется быстрее, потому что ее неактивная память преобразуется в активную память, а не загружается с более медленного диска.
Я искал больше онлайн-ресурсов и попал в эту ветку в списке рассылки ядра darwin, который достаточно информативен. Цитирую Джима Маги (из команды Дарвина - я думаю):
Короче говоря, система VM ядра при работе с давлением памяти просматривает используемые страницы и пытается удержать их в равновесии между активной и неактивной маркировкой. Неактивные страницы сканируются для повторного использования, но помечаются как неактивные. Если они были использованы повторно, они помечаются как активные, и некоторые другие страницы должны переходить из активного в неактивное состояние, чтобы определить, активно ли оно используется. Таким образом, неактивный является неправильным. Это сокращение от «возможно, неактивно, давайте попробуем проверить это».
Как вы обнаружили, внутренний баланс, к которому мы (в данный момент) стремимся, составляет примерно 2/3 активных против 1/3 неактивных ...
Это объясняет поведение, которое вы наблюдаете. Т.е. неактивные страницы, которые вы видите, принадлежат запущенным программам, которые недавно не использовались. Поэтому, когда вы запускаете новую программу, неактивные страницы заменяются. В то же время страницы из других программ помечаются как неактивные, чтобы поддерживать соотношение 2: 1 к активным и неактивным.
В ветке также содержатся некоторые предложения, чтобы узнать больше о внутренностях Дарвина. Есть также некоторые предложения на случай, если вы начали исследовать использование памяти из-за проблем с пляжным мячом (которые обычно не имеют к этому никакого отношения).
Вывод остается прежним: доверяйте своему ядру и не пытайтесь перехитрить его. :-)