Миграция на новый менеджер памяти
Это руководство сравнивает новый менеджер памяти 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 |
Что делать |
|
|---|---|---|
Вы можете удалить все использования, хотя предупреждений об использовании этого API в новом менеджере памяти нет. |
||
Используйте |
||
Удалите все использования. |
||
Удалите все использования. |
||
Удалите все использования. |
||
Удалите все использования. |
||
Вы можете удалить все использования. Так как заморозка устарела, свойство всегда возвращает |
||
Удалите все использования. |
||
Используйте |
||
Используйте любую стандартную коллекцию вместо него. |
||
Используйте |
||
Используйте |
Поддержка новых и старых менеджеров памяти
Если вы автор библиотеки и вам нужна поддержка старого менеджера памяти или вы хотите иметь резервное решение в случае проблем с новым менеджером памяти, вы можете временно поддержать код для обоих менеджеров памяти.
Чтобы игнорировать предупреждения об устаревании, сделайте следующее:
Добавьте аннотацию
@OptIn(FreezingIsDeprecated::class)к использованиям устаревшего API.Примените
languageSettings.optIn("kotlin.native.FreezingIsDeprecated")ко всем наборам Kotlin-источников в Gradle.Передайте флаг компилятора
-opt-in=kotlin.native.FreezingIsDeprecated.
См. Требования к включению для получения более подробной информации.
Что дальше
© 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