Как устроена память
Память устройства — это иерархическая система хранения данных, включающая регистры процессора, кэш, оперативную память (ОЗУ), постоянную память (ПЗУ) и виртуальную память. В Swift управление памятью автоматизировано с помощью Automatic Reference Counting (ARC), который отслеживает ссылки на объекты и освобождает память, когда на объект больше нет активных ссылок.
Иерархия памяти
Память устроена как пирамида: сверху — самые быстрые и маленькие уровни, снизу — медленные и большие. Это позволяет сбалансировать скорость доступа и объём хранилища.
- Регистры процессора — встроены в CPU, работают на частоте процессора, хранят данные, с которыми процессор работает в данный момент. Объём — несколько десятков байт.
- Кэш-память — расположена на процессоре или рядом, делится на уровни L1, L2, L3. L1 — самый быстрый и маленький (обычно 32–64 КБ), L2 — больше (несколько сотен КБ), L3 — общий для ядер (несколько МБ). Кэш хранит копии часто используемых данных из ОЗУ.
- Оперативная память (ОЗУ) — основное хранилище для работающих программ и данных. Быстрая, но энергозависимая: при выключении питания данные теряются. Объём — от нескольких ГБ до десятков ГБ.
- Постоянная память (ПЗУ, SSD, HDD) — энергонезависимая, хранит данные долговременно. SSD работает на флеш-памяти и быстрее HDD, который использует магнитные диски.
- Виртуальная память — механизм ОС, позволяющий использовать часть диска как расширение ОЗУ. Когда ОЗУ заполнено, редко используемые страницы перемещаются в файл подкачки (swap), освобождая место.
Управление памятью в Swift
Swift использует ARC (Automatic Reference Counting) для автоматического управления памятью. Каждый объект класса имеет счётчик ссылок. Когда счётчик падает до нуля, память объекта освобождается. Это предотвращает утечки и переполнение памяти.
Пример:
class Person {
let name: String
init(name: String) { self.name = name }
}
var person1: Person? = Person(name: "Alice")
var person2 = person1 // счётчик ссылок = 2
person1 = nil // счётчик = 1
person2 = nil // счётчик = 0, память освобождаетсяARC работает только для классов (ссылочных типов). Структуры и перечисления — значимые типы, они хранятся в стеке и копируются при присваивании.
Подводные камни
- Циклы сильных ссылок — когда два объекта ссылаются друг на друга, счётчики не обнуляются, и память не освобождается. Решение — использовать
weakилиunownedдля одной из ссылок. - Утечки в замыканиях — если замыкание захватывает
selfсильно, аselfхранит замыкание, возникает цикл. Используйте[weak self]в списке захвата. - Виртуальная память — на iOS не используется файл подкачки, вместо этого применяется сжатие памяти и принудительное завершение фоновых процессов.
Коротко
- Память — иерархия: регистры, кэш, ОЗУ, ПЗУ, виртуальная память.
- Swift управляет памятью через ARC, освобождая объекты с нулевым счётчиком ссылок.
- Опасность — циклы сильных ссылок, их избегают с помощью
weakиunowned. - На iOS нет swap-файла, вместо этого — сжатие памяти и выгрузка процессов.
