迁移到新的内存管理器
NOTE
对旧版内存管理器的支持已在 Kotlin 1.9.20 中完全移除。请将您的项目迁移到
当前的内存模型,该模型自 Kotlin 1.7.20 起已默认启用。
本指南比较了新的 Kotlin/Native 内存管理器 与旧版管理器,并描述了如何迁移您的项目。
新的内存管理器最显著的变化是取消了对象共享的限制。您无需冻结对象即可在线程之间共享它们,具体来说:
- 顶层属性可由任何线程访问和修改,无需使用
@SharedImmutable
。 - 通过互操作 (interop) 传递的对象可由任何线程访问和修改,无需冻结它们。
Worker.executeAfter
不再要求操作被冻结。Worker.execute
不再要求生产者返回独立的(isolated)对象子图(object subgraph)。- 包含
AtomicReference
和FreezableAtomicReference
的引用循环不会导致内存泄漏。
除了轻松共享对象之外,新的内存管理器还带来了其他主要变化:
- 全局属性在其定义所在的文件首次被访问时才惰性初始化。以前,全局属性是在程序启动时初始化的。作为一种变通方法,您可以使用
@EagerInitialization
注解标记那些必须在程序启动时初始化的属性。使用前,请查阅其文档。 by lazy {}
属性支持线程安全模式,并且不处理无界递归。Worker.executeAfter
中逃逸operation
的异常会像在其他运行时部分一样进行处理,即尝试执行用户定义的未处理异常钩子,如果未找到钩子或钩子本身执行失败并抛出异常,则终止程序。- 冻结(Freezing)已弃用且始终禁用。
请遵循以下指南,将您的项目从旧版内存管理器迁移:
更新 Kotlin
新的 Kotlin/Native 内存管理器自 Kotlin 1.7.20 起已默认启用。检查 Kotlin 版本,如有必要,请更新到最新版本。
更新依赖
更新代码
为了支持新的内存管理器,请移除受影响 API 的用法:
旧版 API | 操作 |
---|---|
@SharedImmutable | 您可以移除所有用法,不过,在新内存管理器中使用此 API 不会有警告。 |
FreezableAtomicReference 类 | 请改用 AtomicReference 。 |
FreezingException 类 | 移除所有用法。 |
InvalidMutabilityException 类 | 移除所有用法。 |
IncorrectDereferenceException 类 | 移除所有用法。 |
freeze() 函数 | 移除所有用法。 |
isFrozen 属性 | 您可以移除所有用法。由于冻结(freezing)已弃用,该属性始终返回 false 。 |
ensureNeverFrozen() 函数 | 移除所有用法。 |
atomicLazy() 函数 | 请改用 lazy() 。 |
MutableData 类 | 请改用任何常规集合。 |
WorkerBoundReference<out T : Any> 类 | 直接使用 T 。 |
DetachedObjectGraph<T> 类 | 直接使用 T 。要通过 C 互操作(C interop)传递值,请使用 StableRef 类。 |