Spec-Zone.ru › Kotlin 1.7

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

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

  • 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.

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

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

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

  • Пометьте используемые устаревшие API аннотацией @OptIn(FreezingIsDeprecated::class).

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

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

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

Что дальше

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

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

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

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