Skip to content

迁移到新的内存管理器

NOTE

对旧版内存管理器的支持已在 Kotlin 1.9.20 中完全移除。请将您的项目迁移到

当前的内存模型,该模型自 Kotlin 1.7.20 起已默认启用。

本指南比较了新的 Kotlin/Native 内存管理器 与旧版管理器,并描述了如何迁移您的项目。

新的内存管理器最显著的变化是取消了对象共享的限制。您无需冻结对象即可在线程之间共享它们,具体来说:

  • 顶层属性可由任何线程访问和修改,无需使用 @SharedImmutable
  • 通过互操作 (interop) 传递的对象可由任何线程访问和修改,无需冻结它们。
  • Worker.executeAfter 不再要求操作被冻结。
  • Worker.execute 不再要求生产者返回独立的(isolated)对象子图(object subgraph)。
  • 包含 AtomicReferenceFreezableAtomicReference 的引用循环不会导致内存泄漏。

除了轻松共享对象之外,新的内存管理器还带来了其他主要变化:

  • 全局属性在其定义所在的文件首次被访问时才惰性初始化。以前,全局属性是在程序启动时初始化的。作为一种变通方法,您可以使用 @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

接下来