本期检索说明

先读取 content/collections/deep-radar 截至 2026-09-26 的全部原文链接,并按 URL、标题与实现机制去重。最近 24 小时只有两项同时给出实测、源码级差异、原理解释与可迁移工程结论:Kotlin/Native 缩短 LLVM generation state 生命周期,以及 HotSpot 在 RISC-V AOT code cache 配置中记录 SATP 页表模式。两项均为开放 PR、尚未合入主线,本文只评价公开 patch 与作者给出的可复核实验,不把结果写成已发布能力。Rust、Zig 与 Linux 的新候选没有同时满足三项证据红线,因此不为数量凑数。

主题 原始发布日期 一手来源与交叉验证 截稿状态 推荐强度
Kotlin/Native 在 clang/link 前释放 LLVM generation state 2026-09-26 16:42(中原标准时间) Kotlin PR #8454 / 完整 patch / 8 组交错 A/B / 产物哈希与模拟器 smoke test 开放评审,尚未合入 强烈推荐,重点看进程树峰值与对象生命周期
RISC-V AOT cache 记录 SATP mode 2026-09-26 16:23(中原标准时间) OpenJDK PR #33081 / 完整 patch / Sv57 创建与加载日志 / Sv48 拒绝日志 / tier1–3 开放评审,尚未合入 推荐,重点看缓存兼容性指纹

01 · Kotlin/Native:在外部编译器峰值到来前结束 LLVM 对象生命周期

原文与日期: Kotlin/Native 团队,2026-09-26 16:42(中原标准时间);Kotlin PR #8454、完整源码 patch 与 Kotlin/Native backend 源码。

为什么值得读: 这是一个比“给 JVM 加大堆”更可迁移的内存峰值案例。Kotlin/Native 在生成 bitcode、序列化依赖之后,后续外部 clang 编译与 linker 已不再需要 NativeGenerationState;旧控制流却让其中的 LLVM module、上下文与后端对象一直活到整个编译结束,使 JVM/LLVM 占用与 clang 子进程峰值重叠。补丁把释放动作放到最后一个消费者之后、外部编译之前,直接缩短大对象的 live range。

核心技术结论: 先构造只包含 bitcode 文件与依赖追踪结果的 ModuleCompilationOutput,再显式 dispose() generation state。optimized、非 cache 产物额外触发一次 Full GC,使已断开的 Java wrapper 和 native peer 在 clang 启动前回收。关键不是“GC 能省内存”,而是先证明对象已经越过最后使用点;否则主动 GC 只会增加停顿而不会降低峰值。

Kotlin
val moduleCompilationOutput = ModuleCompilationOutput(bitcodeFile, dependenciesTrackingResult)
generationState.dispose()
if (config.optimizationsEnabled && !config.produce.isCache) {
    System.gc()
}
generationStateEngine.compileAndLink(moduleCompilationOutput, ...)

最有价值的实验、源码与 benchmark 细节: 作者在 Kotlin 3a47… 与 Animeko dfca… 上构建 iosSimulatorArm64 Release framework,JDK 为 Temurin 21.0.9、Gradle 9.3.1、LLVM 21.1.6,G1、-Xmx32g、--max-workers=4,关闭 daemon、build cache 与 configuration cache,并隔离 Gradle/Konan home。预热后做 8 组串行交错 A/B:完整进程树峰值 RSS 中位数从 40.699 GiB 降到 33.408 GiB,下降 17.9%;基线范围 39.991–41.085 GiB,补丁范围 32.918–33.645 GiB,8 组配对都更低。

代价与边界同样重要:Full GC 中位停顿约 709 ms;完整构建中位数 408.772→410.059 s,没有速度收益。16 次完整流程的峰值仍都出现在 clang 重叠阶段,说明实验确实测到要解决的峰值,而不是只读 JVM 自身 RSS。产物哈希一致;Mach-O code section 仍各有两种变体,反汇编差异是读取 GOT 后绑定 _objc_msgSend 的地址差异,A/B 两侧都会出现,作者把它归为 linker nondeterminism,并补做 simulator smoke test。复测时应坚持记录整个进程树,而不是只看 Gradle JVM。

适合的工程师背景: 维护 Kotlin/Native、LLVM 编译流水线、Gradle native task,或需要压低“托管运行时 + 外部编译器/链接器”叠加峰值的编译器基础设施工程师。

预计阅读收益: 约 35–50 分钟;能学到如何定位最后使用点、把 native peer 释放与 GC 分开验证,以及用交错 A/B、进程树 RSS、产物一致性与负向时间数据评估内存优化。

02 · Java/JVM:AOT cache 为什么必须知道 RISC-V 用的是 Sv48 还是 Sv57

原文与日期: OpenJDK RISC-V port 团队,2026-09-26 16:23(中原标准时间);OpenJDK PR #33081、完整源码 patch 与 AOT code cache 配置源码。

为什么值得读: AOT cache 不只是“同 ISA 就能复用”。RISC-V satp 选择的 Sv48/Sv57 决定有效虚拟地址宽度与页表层级;一个缓存若在 57-bit 模式生成、却在 48-bit 模式装载,机器代码、地址布局与运行时假设可能不再兼容。这个补丁展示了如何把微架构/OS 配置变成持久化缓存的兼容性指纹,并在映射后、执行前 fail closed。

核心技术结论: HotSpot 已通过 AOTCacheConfig 序列化并比较 CPU feature、flag 和若干平台参数。补丁只增加一个配置项,把 VM_Version::satp_mode.value() 作为整数写入 cache header;装载端沿用统一比较路径,模式不一致时禁用 AOT cache、回退常规执行。小 patch 的价值恰在于把新约束放入已有的集中式协议,而不是在 RISC-V 启动代码里另写一条特殊分支。

C++
do_fun(int, RVZicbozBlockSize, VM_Version::zicboz_block_size())
do_fun(int, SatpMode, (int)VM_Version::satp_mode.value())

最有价值的实验、源码与 benchmark 细节: 作者用 QEMU 的 -cpu ...,sv57=on/off 构造两种页表模式,并注明 Sv57 启动还依赖 OpenJDK PR #32001。Sv57 创建 cache 用时 31.759 s,写入 367 个条目:cache 文件 8,957,952 bytes,code cache 475,000 bytes,其中 adapters 282、shared blobs 17、stub generators 4、C1 42、C2 22。随后在 Sv57 上映射 479,232 bytes 并成功装载全部 367 项。

同一份 Sv57 cache 放到默认 Sv48 环境时,VM 在映射后打印:AOT Code Cache disabled: it was created with ... satp_mode ... = 57 vs current 48,没有继续使用缓存。作者还在 SG2044 上跑过 release 配置的 tier1–tier3。这里没有吞吐提升,实验价值是正反两条兼容性路径完整闭环:同模式成功复用,异模式明确拒绝。值得继续补强的是专门的 jtreg 回归与真实 Sv57 硬件覆盖;PR 目前仍在开放评审。

适合的工程师背景: 维护 HotSpot AOT/CDS/Leyden、RISC-V port、持久化 JIT cache,或需要为跨机器缓存设计兼容性协议的运行时工程师。

预计阅读收益: 约 25–40 分钟;能理解 SATP mode 如何进入 AOT cache 的兼容性边界,以及为何配置指纹必须默认拒绝未知或不匹配环境。

中国大陆 ToC 硬件价格观察

数据口径

窗口为 2026-08-29 至 2026-09-27,单位人民币,六类硬件固定同一 SKU。今天通过公开比价页的实时渲染结果复核到 CPU、GPU、主板、HDD、SSD 五类报价;DRAM 页面仍明确显示“暂无报价”,因此不新增点。重复价格作为真实采样保留,用来区分“已复核横盘”和“未取得数据”。SSD 只采用当前 2TB 规格的全网比价栏,不采用跨容量聚合的“¥819 起”。

中国大陆六类 PC 硬件公开价格事件

类别 9 月 27 日可复核价 30 日窗口内真实走势 建议
CPU Ryzen 7 9800X3D,京东 ¥2,619 9/3 ¥2,599 → 9/9 ¥2,449 → 9/23–24 ¥2,579 → 9/25–27 ¥2,619 观望或接近前低时入手;比窗口低点高 6.94%,连续三日横盘
GPU MSI RTX 5070 VENTUS 3X 12G,亚马逊中国 ¥4,464.34 8/29–9/27 十三个真实点均为 ¥4,464.34 刚需可比价后入手;该渠道横盘,但与国内自营售后口径不可等同
主板 ASUS TUF B850M-PLUS WIFI7,天猫 ¥1,299 8/31 ¥1,449 → 9/2–9/27 ¥1,299 刚需可入;较窗口首点低 10.35%,多次复核横盘
DRAM 暂无报价;最后可复核 9/9 ¥3,900 9/2 ¥3,900 → 9/5 ¥3,860 → 9/6–9/9 ¥3,900 观望;固定 SKU 缺价,不用其他容量、颗粒或时序替代
HDD IronWolf Pro 8TB ST8000NE001,i百联 ¥1,849 9/1–9/27 十二个真实点均为 ¥1,849 容量刚需可买;先核对型号、五年保修与数据恢复服务
SSD ZHITAI Ti600 2TB,京东 ¥1,799 9/2 ¥1,919 → 9/23–27 ¥1,799 观望;可比价下降 6.25%,但 9/26 公开爆料为 ¥1,889,需核对实际可下单价

价格来源: 9800X3D、MSI RTX 5070 VENTUS 3X、ASUS TUF B850M-PLUS WIFI7、Kingston FURY DDR5-6000 32GB、IronWolf Pro 8TB、ZHITAI Ti600 2TB。

判断依据

五个可报价 SKU 今天均与昨日持平,没有新的连续下跌信号。CPU 仍高于 9 月 9 日低点;GPU 是亚马逊中国渠道价,主板与 HDD 长时间横盘;SSD 的 2TB 比价栏为 ¥1,799,但同页 9 月 26 日京东爆料为 ¥1,889,说明聚合栏与实际活动价可能存在时差。DRAM 固定 SKU 继续缺价。基于这些证据,本期不把横盘解释成全市场稳定,也不预测继续下跌。

其它你可能关心的

本期结论

两项改动都在补齐“跨阶段边界”上的隐性成本。Kotlin/Native 让已经完成使命的 LLVM 状态不再与 clang 峰值共存,使完整进程树峰值 RSS 下降 17.9%,同时如实接受约 709 ms Full GC 且没有构建提速;HotSpot 则把 RISC-V SATP mode 纳入 AOT cache 指纹,让 Sv57 cache 在 Sv48 环境中明确失效,而不是把机器配置差异留到执行期。前者是生命周期管理,后者是持久化兼容性管理,共同原则都是在边界处显式表达已知约束。