Kotlin 2.3.20 重磅更新:GC 默认启用并发标记,UI 响应速度大幅提升

150 阅读3分钟

2026 年 1 月 29 日,Kotlin 2.3.20-Beta2 发布。这次更新虽然还是 Beta 版,但带来了一个实验性但意义重大的变化:Kotlin/Native 的垃圾回收器(GC)默认启用了并发标记(Concurrent Marking)

一、什么是并发标记 GC?

先说问题

在之前的默认配置 PMCS(Parallel Mark Concurrent Sweep)中:

GC 标记阶段必须暂停所有应用线程。

这意味着什么?当 GC 需要标记堆中的对象时,你的应用会停下来等待

对于延迟敏感的应用——尤其是 UI 应用,这种"暂停"直接表现为卡顿、掉帧

再说解决

CMS(Concurrent Mark and Sweep)的核心改进:

标记阶段可以与应用线程并发执行!

简单来说:GC 标记对象时,你的应用可以继续运行。

二、实际效果

官方已经用 Compose Multiplatform UI 应用做了基准测试:

CMS 显著改善了性能表现。

这意味着:

  • 更短的 GC 暂停时间
  • 更流畅的用户界面
  • 更好的响应速度

三、如何使用

默认启用(Beta 版)

在 Kotlin 2.3.20-Beta1 和 Beta2 中,CMS 已经是默认配置

你什么都不用改,直接升级版本就能体验:

kotlin("multiplatform") version "2.3.20-Beta2"

如果遇到问题

CMS 仍然是实验性功能,在某些情况下可能导致:

  • 运行时崩溃
  • 吞吐量下降
  • 内存占用增加

如果遇到回归问题,可以手动切回 PMCS:

# gradle.properties
kotlin.native.useNativeCms=false

四、开发者的谨慎

Kotlin 团队采取的是渐进式发布策略

版本GC 模式
2.3.20-Beta1/2CMS(默认,收集反馈)
2.3.20-RC回滚到 PMCS
2.3.20 正式版待定

为什么这么做?

官方说得很直白:

需要收集更多反馈,确保发现所有问题。

这是负责任的态度——先在 Beta 版让广大开发者帮忙"压力测试",收集足够数据后再决定正式版是否默认启用。

五、其他更新亮点

1. C/Obj-C 互操作新模式

如果你在 Kotlin Multiplatform 中使用 C 或 Objective-C 库,可以尝试新的互操作模式:

kotlin {
    targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget>().configureEach {
        compilations.configureEach {
            cinterops.configureEach {
                extraOpts += listOf("-Xccall-mode", "direct")
            }
        }
    }
}

注意:新模式仍是实验性,不要用此模式发布库

2. JPA 插件增强

kotlin.plugin.jpa 现在自动应用 all-open 插件的 JPA 预设:

plugins {
    kotlin("plugin.jpa") version "2.3.20-Beta2"
}

JPA 实体类自动变成 open,无需手动配置 all-open

支持的注解:

  • javax.persistence.Entity
  • javax.persistence.Embeddable
  • javax.persistence.MappedSuperclass
  • jakarta.persistence.Entity
  • jakarta.persistence.Embeddable
  • jakarta.persistence.MappedSuperclass

3. Maven 配置简化

新建 Kotlin Maven 项目时,不再需要手动:

  • 创建源码目录
  • 添加 kotlin-stdlib 依赖
<configuration>
    <sourceRootsAutoDetection>true</sourceRootsAutoDetection>
</configuration>

4. Gradle 9.3.0 兼容

支持 Gradle 7.6.3 到 9.3.0。

Kotlin/JVM 编译默认使用 Build tools API (BTA)。

5. 标准库新增 API

Map.Entry.copy() 扩展函数,用于创建 Map.Entry 的不可变副本:

@OptIn(ExperimentalStdlibApi::class)
val mutableMap = mutableMapOf("key" to "value")
val entry = mutableMap.entries.first()
val copy = entry.copy() // 创建不可变副本

六、写到最后

Kotlin 2.3 的 GC 改进,对 Kotlin/Native 生态——尤其是 Compose Multiplatform 开发者来说,是一个值得期待的进步

虽然目前还是 Beta 实验,但:

  • 如果你开发 UI 应用
  • 你在意用户体验
  • 你受够了 GC 卡顿

不妨现在就试试 Beta 版,把你的反馈提交给官方。

你的每一个问题报告,都是在帮 Kotlin 变得更好。


参考资料

升级提醒:IDE 支持 Kotlin 2.3.20-Beta2 的插件已捆绑在最新版 IntelliJ IDEA 和 Android Studio 中,只需修改 build.gradle.kts 中的版本号即可。