Как реагировать на уведомления о давлении памяти из GCD?

Я использую GCD для получения уведомлений о давлении памяти.

В документации GCD описаны некоторые константы, например:

DISPATCH_MEMORYPRESSURE_WARN

Состояние давления системной памяти находится на стадии предупреждения. Приложения должны освобождать память, которая им не нужна прямо сейчас.

DISPATCH_MEMORYPRESSURE_CRITICAL

Состояние давления системной памяти находится на критической стадии. Приложения должны освобождать как можно больше памяти.

Кажется логичным, что я должен освободить неиспользуемую память. Однако в других местах ( справочные страницы и исходный код) я нахожу это примечание связанным с этими константами:

Повышенное давление памяти - это общесистемное условие, на которое приложения, зарегистрированные для этого источника, должны реагировать, изменяя свое будущее использование памяти, например, уменьшая размеры кеша вновь инициированных операций, пока давление памяти не вернется к нормальному состоянию.

Тем не менее, приложения НЕ ДОЛЖНЫ пересматривать и отбрасывать существующие кэши для прошлых операций, когда системное давление в памяти переходит в повышенное состояние, поскольку это может инициировать операции ВМ, что еще больше усугубит давление в системной памяти.

Это смущает меня. Должен ли я освободить память или просто прекратить выделять новую память?

1 ответ

MacOS имеет систему виртуальной памяти (VM), которая использует резервное хранилище: файловую систему. Файловая система используется для хранения памяти, которая в данный момент не используется. Когда системе не хватает реальной памяти (RAM), вещи в памяти, которые не используются активно, могут быть записаны на диск и позже загружены обратно в RAM.

В iOS есть система виртуальной памяти, но нет резервного хранилища. Когда память заканчивается, система просит приложения уменьшить объем памяти. Если это не освободит достаточно памяти, система начнет убивать приложения.

Руководство, которое вы цитируете из заголовков libdispatch, относится к системе виртуальной памяти MacOS, а не к iOS.

На iOS приложение должно отбрасывать объекты и уменьшать размеры кеша при обработке предупреждения о памяти. Особое внимание следует уделять объектам, которые используют грязную (не очищаемую) память. Это память, которую система не может автоматически использовать самостоятельно - она ​​должна быть сначала удалена приложением. В типичном приложении iOS изображения (картинки) используют самую грязную память.

Другие вопросы по тегам