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