Почему «свободная RAM» на macOS вводит в заблуждение

Низкое значение свободной оперативной памяти на Mac часто выглядит тревожно: в Activity Monitor остаются всего несколько сотен мегабайт, а система начинает казаться перегруженной. Однако сама по себе цифра Free почти ничего не говорит о том, хватает ли компьютеру памяти. Попытки исправить ситуацию с помощью утилит, которые регулярно запускают очистку RAM, могут даже ухудшить производительность.
Почему macOS старается занять всю память
Пустующая оперативная память не приносит пользы, поэтому macOS использует её для кэширования файлов. Благодаря этому приложения и документы, к которым пользователь обращается повторно, могут открываться быстрее — системе не приходится каждый раз читать их с диска. Когда память понадобится другому процессу, такой кэш можно быстро освободить.
В Activity Monitor память разделяется на несколько основных категорий. App Memory — анонимная память приложений, Wired — данные ядра и драйверов, а Compressed — страницы, сжатые системой вместо немедленной записи в своп. Эти области нельзя мгновенно освободить без последствий. Cached Files, напротив, представляет собой файловый кэш и может быть освобождён при необходимости.
Показатель Memory Used в Activity Monitor примерно складывается из App Memory, Wired и Compressed. Поэтому небольшой объём Free нередко означает лишь то, что остальная память занята полезным кэшем. Оценивать состояние системы по одной этой строке некорректно. Те же основные показатели можно получить программно через Mach API, используя статистику виртуальной памяти и размер страницы, который возвращает macOS.
Главная метрика — давление на память
Реальную нагрузку на подсистему памяти лучше показывает memory pressure — оценка, которую формирует само ядро macOS. Она отражает, насколько системе сложно находить свободные страницы. Пока в памяти остаётся достаточно кэша, давление может быть нормальным даже при почти нулевом значении Free.
Проблемы начинаются, когда кэш уже не помогает, а системе приходится активно сжимать страницы и обращаться к свопу. Уровень давления можно получить через sysctl с параметром kern.memorystatus_vm_pressure_level: значение 1 соответствует normal, 2 — warning, 4 — critical. Для отслеживания изменений без постоянного опроса также предусмотрен DispatchSource.makeMemoryPressureSource.
Практическое правило выглядит так: при нормальном memory pressure памяти, скорее всего, достаточно, даже если показатель Used кажется высоким. Если давление регулярно переходит в warning или critical, а объём свопа растёт, это уже признак реальной нехватки RAM. Данные о свопе macOS предоставляет через параметр vm.swapusage.
Почему автоматический purge не решает проблему
Утилита /usr/sbin/purge сбрасывает файловый кэш, после чего объём свободной памяти действительно увеличивается. Но освобождённые данные затем приходится заново читать с диска. Через некоторое время кэш заполнится снова, а система получит дополнительную нагрузку на операции ввода-вывода.
При нормальном давлении регулярный purge не даёт заметной пользы. Он может быть оправдан только в критической ситуации, когда системе требуется быстро освободить место. Поэтому в Mac Monitor автоматическая очистка по умолчанию отключена: её можно запустить вручную или разрешить только при уровне critical, причём не чаще одного раза в минуту.
Что показывает Mac Monitor
Из этой идеи появился небольшой монитор для строки меню macOS — Mac Monitor. В компактном режиме он показывает один выбранный показатель: скорость сети, процент использования RAM или загрузку CPU. В раскрываемой панели доступны memory pressure, распределение памяти по категориям App, Wired, Compressed и Cached, сведения о свопе, нагрузка на отдельные ядра, сеть и диск.
Приложение сохраняет историю за 24 часа: графики RAM и CPU строятся по минутным агрегатам, а также фиксируется количество минут, проведённых в состоянии критического давления. История переживает перезапуск программы. Монитор не выполняет сетевых запросов: в нём нет URLSession, аналитики и проверки обновлений, а скорость сети рассчитывается по счётчикам интерфейсов, полученным через getifaddrs.
Mac Monitor написан на SwiftUI и AppKit, не использует сторонние зависимости и занимает около 2 000 строк кода. В обычном режиме приложение потребляет примерно 1% CPU и около 50 МБ памяти. Тяжёлые операции — например, сбор данных о процессах, GPU и батарее — выполняются только при открытии соответствующего окна. Доступны русский, английский и узбекский языки, переключение не требует перезапуска.
Проект распространяется бесплатно по лицензии MIT. Установить его можно из DMG-релиза или через Homebrew, а при необходимости — собрать из исходного кода. Приложение не нотаризовано из-за отсутствия платного аккаунта разработчика, поэтому при первом запуске macOS может потребовать выбрать «Open Anyway» в настройках безопасности.


