Переход на новый менеджер памяти
В этом руководстве сравниваются новый менеджер памяти 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, чтобы создать диспетчер корутин, работающий на основе пула изNWorker.Dispatchers.Mainиспользует основную очередь в Darwin и отдельный Worker на других платформах.
- Ktor
Обновитесь до версии 2.0 или более поздней.
- Другие зависимости
-
Большинство библиотек должно работать без изменений, однако возможны исключения.
Обязательно обновите зависимости до последних версий; различий между версиями библиотек для устаревшего и нового менеджера памяти нет.
Обновите код
Чтобы обеспечить поддержку нового менеджера памяти, удалите использование затронутого API:
Старый API |
Что делать |
|---|---|
Можно удалить все его использования, хотя в новом менеджере памяти предупреждения об использовании этого API отсутствуют. |
|
Вместо него используйте |
|
Удалите все его использования. |
|
Удалите все его использования. |
|
Удалите все его использования. |
|
Удалите все ее использования. |
|
Можно удалить все его использования. Поскольку замораживание объявлено устаревшим, свойство всегда возвращает |
|
Удалите все ее использования. |
|
Вместо нее используйте |
|
Вместо него используйте любую обычную коллекцию. |
|
Используйте непосредственно |
|
Используйте непосредственно |
Что дальше
© 2010–2026 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