Spec-Zone.ru › Kotlin 1.9

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

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

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

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

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

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

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

  • Используйте компиляторский флаг -opt-in=kotlin.native.FreezingIsDeprecated.

Подробности см. в Требованиях к включению.

Что дальше

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

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

Последнее изменение: 29 декабря 2022
Интеграция с 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