0Pricing
Kotlin Academy · Урок

Управление памятью в Kotlin/Native: новый MM

Изучите новый диспетчер памяти Kotlin/Native, сборщик мусора и владение объектами

«Управление памятью в Kotlin/Native: новый MM» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Проблема старой модели памяти

Исходная модель памяти Kotlin/Native (до версии 1.7.20) была «неизменяемой по умолчанию»: объекты нужно было замораживать перед пересечением границ потоков. Это усложняло многопоточный код и делало его несовместимым с семантикой корутин Kotlin.

Новый менеджер памяти (1.7.20+)

Начиная с Kotlin 1.7.20, Kotlin/Native использует новую модель памяти со сборкой мусора, которая имитирует поведение JVM/JS. По умолчанию изменение объектов между потоками разрешено. API freeze() / isFrozen объявлены устаревшими и ничего не делают.

Устройство сборщика мусора

Новая MM использует сборщик мусора с остановкой приложения, разметкой и очисткой, который работает в отдельном потоке сборщика мусора. Он призван свести время пауз к минимуму и работает поэтапно. В будущих выпусках стратегия сборки мусора будет и дальше совершенствоваться.

Корутин и новая MM

С новой MM kotlinx.coroutines работает в Kotlin/Native так же, как и в JVM. Вы можете совместно использовать изменяемое состояние между корутинами, применяя те же шаблоны (например, изменяемое поле, защищённое Mutex), без замораживания.

val mutex = Mutex()
var counter = 0

suspend fun increment() = mutex.withLock { counter++ }

Безопасность потоков в новой MM

Новая MM не обеспечивает автоматическую безопасность потоков — Вам по-прежнему нужно вручную синхронизировать общее изменяемое состояние с помощью Mutex, AtomicInt, AtomicReference либо ограничить состояние одним потоком через диспетчеры корутин.

Атомарные операции в Kotlin/Native

Используйте kotlin.native.concurrent.AtomicInt, AtomicLong, AtomicReference для выполнения неблокирующих атомарных операций над примитивными значениями и ссылками:

val counter = AtomicInt(0)
fun increment() { counter.increment() }
fun read(): Int = counter.value

Жизненный цикл объектов и ARC на целях Apple

На платформах Apple (iOS/macOS) Kotlin/Native использует ARC (подсчёт ссылок) для взаимодействия с объектами Objective-C. Объекты, которыми владеет Kotlin, управляются сборщиком мусора; объекты ObjC/Swift, переданные в Kotlin, подключаются через обёртки, совместимые с ARC.

Утечки памяти: на что обратить внимание

Распространённые проблемы с памятью в Native: циклы удержания между объектами Kotlin и делегатами/замыканиями ObjC, большие графы объектов, не освобождаемые после использования, и долгоживущие фоновые рабочие потоки, удерживающие ссылки на объекты пользовательского интерфейса. Используйте Xcode Instruments для профилирования на целях Apple.

Фоновые рабочие потоки

Используйте kotlin.native.concurrent.Worker для фоновых потоков на уровне платформы (или отдавайте предпочтение корутинам с нативным диспетчером). У каждого Worker есть собственный цикл обработки событий; взаимодействуйте через execute(), который передаёт или совместно использует объекты согласно правилам новой MM.

Переход со старой MM

Удалите все вызовы freeze(), ensureNeverFrozen() и isFrozen. При необходимости замените обходные решения с AtomicReference обычными изменяемыми свойствами, защищёнными Mutex. Обновите kotlinx.coroutines до версии 1.6.4 или новее для поддержки новой MM.

Настройка сборщика мусора

Сборщик мусора можно настроить с помощью системных свойств или параметров двоичного файла Kotlin/Native. Для приложений, чувствительных к задержкам, попробуйте kotlin.native.gc.collectIntervalMillis. На устройствах с ограниченной памятью уменьшите размер кучи с помощью kotlin.native.gc.heapTriggerCoefficient.

Быстрая проверка

Какое ключевое изменение внес новый менеджер памяти Kotlin/Native (1.7.20+)?

Итоги: управление памятью в Kotlin/Native

Главное:

  • Новая MM (1.7.20+): объекты управляются сборщиком мусора, изменяемыми объектами можно делиться между потоками, freeze() ничего не делает
  • Ручная синхронизация по-прежнему необходима: Mutex, AtomicInt, AtomicReference
  • Цели Apple используют ARC для взаимодействия с ObjC; объекты Kotlin управляются сборщиком мусора
  • В новой MM корутины работают так же, как в JVM
  • При переходе на новую MM удалите старые вызовы freeze()

Часто задаваемые вопросы

Урок «Управление памятью в Kotlin/Native: новый MM» бесплатный?

Да — полный текст урока «Управление памятью в Kotlin/Native: новый MM» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Управление памятью в Kotlin/Native: новый MM»?

Изучите новый диспетчер памяти Kotlin/Native, сборщик мусора и владение объектами Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Управление памятью в Kotlin/Native: новый MM»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обзор Kotlin/Native: цели, набор инструментов и компиляция
  2. Управление памятью в Kotlin/Native: новый MM
  3. Взаимодействие с C с помощью cinterop и файлов .def
  4. Kotlin/WASM: компиляция в WebAssembly для браузера
← Назад к Kotlin Academy