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