全部配置 / KN-BINARY-GC

垃圾回收器

Xbinary=gc · KN-BINARY-GC · 编译器参数(Native) · 同源入口 Xgc

重要:高 · 影响大 默认:有默认取值 场合:场景可配 来源:CPF-KMP-CMP社区有改

默认值:cms。社区消费默认 cms(相对上游常为 pmcs)。使用场合:场景可配。按目标。

它是做什么的

用途。选择 Kotlin/Native 垃圾回收器。上游取值 cms / pmcs / stwms / noop;CPF-KMP-CMP社区另支持 cmc(CONCURRENT_MARK_AND_COPY,仅 ohos_arm64 / macos_arm64)。未指定时社区默认常为 cms;与 enableStackmap、crt 分配器存在联动约束。示例取值:`gc=cms`(cms / pmcs / stwms / noop;CPF-KMP-CMP社区另支持 cmc)。说明见《CMC GC 简介》。

影响。影响回收策略、停顿、分配路径与内存表现;须与目标及 runtime 构建匹配,非法组合可能在编译期直接报错。

适用场景。按目标选择 GC(上游 cms/pmcs/stwms/noop;CPF-KMP-CMP社区另支持 cmc,见《CMC GC 简介》);切换后做停顿与内存冒烟。各取值见「取值说明」。

约束与联动。相对上游主要三处:① 未指定时默认 GC 由 pmcs 改为 cms;② 新增取值 cmc(CONCURRENT_MARK_AND_COPY),仅支持 ohos_arm64 / macos_arm64;③ 与 enableStackmap、crt 分配器等增加编译期校验(非法组合会直接报错)。

取值说明

枚举

可写取值全名含义使用场景
noop关闭垃圾回收(不回收 Kotlin 对象)仅测试或极短生命周期程序;官方警告内存会持续上涨,勿用于常态运行
stwmsstop_the_world_mark_and_sweep简单的全局停顿标记-清扫(stop-the-world mark and sweep)需要最简单 STW 收集器、或对比停顿行为时;通常不是默认首选
pmcsparallel_mark_concurrent_sweep并行标记 + 并发清扫(parallel mark concurrent sweep)上游建议:若 CMS 出问题可切回 pmcs 排查/回退
cmsconcurrent_mark_and_sweep并发标记-清扫(concurrent mark and sweep)上游文档写明自 2.4.0 起为默认;本社区未指定时 KonanConfig 默认亦为 cms,一般业务优先
cmcconcurrent_mark_and_copy并发标记-复制(CMC / concurrent mark and copy),走 Common Runtime(CRT)仅 ohos_arm64 / macos_arm64;须与 CRT 分配器等同开,非法组合编译期报错;见《CMC GC 简介》

含义/场景依据:upstream native-binary-options;native-memory-manager(Disable garbage collection)

定义依据:konan/BinaryOptions.kt 在仓库中打开konan/GC.kt 在仓库中打开

怎么用

  1. 配置入口:build.gradle.kts → ohosArm64.binaries.all { freeCompilerArgs += "-Xbinary=gc=cms" }
  2. 示例
// 文件:build.gradle.kts(应用的 Kotlin 模块,例如 composeApp)
kotlin {
  ohosArm64 {  // 按实际 native target 调整
    binaries.all {
      freeCompilerArgs += "-Xbinary=gc=cms"  // cms / pmcs / stwms / noop;CPF-KMP-CMP社区另支持 cmc
    }
  }
}
  1. 生效:Sync 后执行该目标的 compile/link。
  2. 验证:编译日志出现 `-Xbinary=gc=cms`。
  3. 回滚:从 binaries.all 的 freeCompilerArgs 中删除该项后 Clean 并重编。
  4. 注意:cmc/crt 等组合有目标限制;非法取值可能编译期直接失败。

同源旧旗标

应用工程只按上方「怎么用」里的 Gradle 示例配置。下面列出编译器还认识的旧名字,避免对着旧文档混用。

优先级:同时指定时 -Xbinary=gc 优先;取值与校验以 BinaryOptions / KonanConfig 为准。

  • 推荐旗标-Xbinary=gc=<gc>(键 Xbinary=gc) — 应用工程用 binaries.all { freeCompilerArgs += "-Xbinary=gc=…" }。
  • 旧旗标(勿用)-Xgc=<gc>(键 Xgc) — 旧 -X 入口;仅当未设 -Xbinary=gc 时回填 BinaryOptions.gc。

默认行为 cms

不写这个配置时,编译器会怎么处理?

此选项有固定默认取值(见下方说明),不设置时编译器使用该默认值。

社区消费默认 cms(相对上游常为 pmcs)。

相关文档

以下摘抄原文中与本配置最相关的段落,便于速读;完整上下文请点原文。 上游与 CPF 分栏对照。

上游 · Kotlin/Native memory management

If you encounter problems with CMS, switch back to the parallel mark concurrent sweep (PMCS) setup. To do that, set the following binary option in your gradle.properties file:

kotlin.native.binary.gc=pmcs

Enable garbage collection manually

To force-start the garbage collector, call kotlin.native.internal.GC.collect() . This method triggers a new collection and waits for its completion.

Monitor GC performance…

打开原文

溯源与对照

状态
实验(-X,兼容性不保证)
版本基线
2.2.21-1.0.0
定义位置类型
Native 二进制选项(BinaryOptions / -Xbinary)
源码路径
kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BinaryOptions.kt 在仓库中打开
相对上游的改动
相对上游主要三处:① 未指定时默认 GC 由 pmcs 改为 cms;② 新增取值 cmc(CONCURRENT_MARK_AND_COPY),仅支持 ohos_arm64 / macos_arm64;③ 与 enableStackmap、crt 分配器等增加编译期校验(非法组合会直接报错)。