Spec-Zone.ru › Kotlin 1.8

Миграция на новый менеджер памяти

Это руководство сравнивает новый менеджер памяти 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.

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

  • Каждая общая примитивная операция (каналы, потоки, сопрограммы) работает через границы Работников, так как заморозка не требуется.

  • Dispatchers.Default поддерживается пулом Работников на Linux и Windows и глобальной очередью на Apple.

  • Используйте newSingleThreadContext для создания диспетчера сопрограмм, который поддерживается Работником.

  • Используйте newFixedThreadPoolContext для создания диспетчера сопрограмм, поддерживаемого пулом N Работников.

  • Dispatchers.Main поддерживается главной очередью на Darwin и автономным Работником на других платформах.

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 interop используйте класс StableRef.

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

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

Чтобы игнорировать предупреждения об устаревании, сделайте следующее:

  • Добавьте аннотацию @OptIn(FreezingIsDeprecated::class) к использованиям устаревшего API.

  • Примените languageSettings.optIn("kotlin.native.FreezingIsDeprecated") ко всем наборам Kotlin-источников в Gradle.

  • Передайте флаг компилятора -opt-in=kotlin.native.FreezingIsDeprecated.

См. Требования к включению для получения более подробной информации.

END_OF_DOCUMENT_MARKER

Что дальше

  • Узнайте о новом менеджере памяти

  • Настройка интеграции с iOS

Последнее изменение: 10 января 2023
Интеграция с iOS Неизменяемость и конкурентность в Kotlin/Native

© 2010–2023 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