Spec-Zone.ru › Kotlin 2

Переход на новый менеджер памяти

Поддержка устаревшего менеджера памяти полностью удалена в Kotlin 1.9.20. Перенесите свои проекты на текущую модель памяти, включенную по умолчанию начиная с Kotlin 1.7.20.

В этом руководстве сравниваются новый менеджер памяти Kotlin/Native и устаревший менеджер, а также описывается, как перенести свои проекты.

Самое заметное изменение в новом менеджере памяти — снятие ограничений на совместное использование объектов. Чтобы делиться объектами между потоками, больше не нужно их замораживать, в частности:

  • К свойствам верхнего уровня можно обращаться и изменять их из любого потока без использования @SharedImmutable.

  • К объектам, передаваемым через механизм взаимодействия с другими языками, можно обращаться и изменять их из любого потока, не замораживая их.

  • Worker.executeAfter больше не требует замораживать операции.

  • Worker.execute больше не требует, чтобы производители возвращали изолированный подграф объектов.

  • Циклы ссылок, содержащие AtomicReference и FreezableAtomicReference, не приводят к утечкам памяти.

Помимо упрощения совместного использования объектов, новый менеджер памяти также вносит другие важные изменения:

  • Глобальные свойства инициализируются лениво при первом обращении к файлу, в котором они определены. Ранее глобальные свойства инициализировались при запуске программы. В качестве обходного решения можно пометить свойства, которые необходимо инициализировать при запуске программы, аннотацией @EagerInitialization. Перед использованием ознакомьтесь с документацией.

  • Свойства by lazy {} поддерживают режимы потокобезопасности и не обрабатывают неограниченную рекурсию.

  • Исключения, выходящие за пределы operation в Worker.executeAfter, обрабатываются так же, как и в других частях среды выполнения: предпринимается попытка вызвать пользовательский обработчик необработанных исключений, а если он не найден или сам завершается с исключением, программа прекращает работу.

  • Замораживание объявлено устаревшим и всегда отключено.

Следуйте этим рекомендациям, чтобы перенести свои проекты с устаревшего менеджера памяти:

Обновите Kotlin

Новый менеджер памяти Kotlin/Native включен по умолчанию начиная с Kotlin 1.7.20. Проверьте версию Kotlin и при необходимости обновите ее до последней.

Обновите зависимости

kotlinx.coroutines

Обновитесь до версии 1.6.0 или более поздней. Не используйте версии с суффиксом native-mt.

При работе с новым менеджером памяти также следует учитывать некоторые особенности:

  • Все основные примитивы (каналы, потоки, корутины) работают между границами Worker, поскольку замораживание не требуется.

  • Dispatchers.Default использует пул Worker в Linux и Windows и глобальную очередь на платформах Apple.

  • Используйте newSingleThreadContext, чтобы создать диспетчер корутин, работающий на основе Worker.

  • Используйте newFixedThreadPoolContext, чтобы создать диспетчер корутин, работающий на основе пула из N Worker.

  • Dispatchers.Main использует основную очередь в Darwin и отдельный Worker на других платформах.

Ktor

Обновитесь до версии 2.0 или более поздней.

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

Большинство библиотек должно работать без изменений, однако возможны исключения.

Обязательно обновите зависимости до последних версий; различий между версиями библиотек для устаревшего и нового менеджера памяти нет.

Обновите код

Чтобы обеспечить поддержку нового менеджера памяти, удалите использование затронутого API:

Старый API

Что делать

@SharedImmutable

Можно удалить все его использования, хотя в новом менеджере памяти предупреждения об использовании этого API отсутствуют.

Класс FreezableAtomicReference

Вместо него используйте AtomicReference.

Класс FreezingException

Удалите все его использования.

Класс InvalidMutabilityException

Удалите все его использования.

Класс IncorrectDereferenceException

Удалите все его использования.

Функция freeze()

Удалите все ее использования.

Свойство isFrozen

Можно удалить все его использования. Поскольку замораживание объявлено устаревшим, свойство всегда возвращает false.

Функция ensureNeverFrozen()

Удалите все ее использования.

Функция atomicLazy()

Вместо нее используйте lazy().

Класс MutableData

Вместо него используйте любую обычную коллекцию.

Класс WorkerBoundReference<out T : Any>

Используйте непосредственно T.

Класс DetachedObjectGraph<T>

Используйте непосредственно T. Для передачи значения через взаимодействие с C используйте класс StableRef.

Что дальше

  • Подробнее о новом менеджере памяти

  • Узнайте об особенностях интеграции со Swift/Objective-C ARC

  • Узнайте, как безопасно обращаться к объектам из разных корутин

12 августа 2026 г.
Интеграция со Swift/Objective-C ARCПараметры бинарных файлов Kotlin/Native

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-migration-guide.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API