本期检索说明
先读取 content/collections/deep-radar 中截至 2026-08-30 的原文链接,并按 URL、标题和技术问题语义去重。最近 24 小时内最终只有 1 篇 Rust、1 篇 Java/OpenJDK 材料同时具备实测、源码证据、原理解释和工程迁移价值,因此没有回溯旧材料凑数。Kotlin、Zig 与 Linux 本周期没有达到全部硬门槛的新增资料。
两项修改都仍处于公开评审阶段,本文分析的是已经给出源码与复现实验的提案,不把它们写成已合入版本的既成事实。
| 主题 | 原始发布日期 | 一手来源与交叉验证 | 截稿状态 | 推荐强度 |
|---|---|---|---|---|
| OpenJDK 交叉编译的增量状态串扰 | 2026-08-31(中原标准时间) | OpenJDK RFR / JDK-8348737 / Webrev | Open,未合入 | 推荐 |
next-solver 的 CanonicalQueryInput 驻留 |
2026-08-31(中原标准时间) | rustc PR / 编译内存 issue / 2026 trait-solver goal | Open,未合入 | 必读 |
01 · OpenJDK:一个未区分目标平台的变量,让零改动构建重编 3,396 个文件
原文与日期: benshuai5D,2026-08-31(中原标准时间);OpenJDK PR #32593。问题追踪见 JDK-8348737,源码审阅见 Webrev 00。
为什么值得读: 这不是“Makefile 慢”的泛泛案例,而是一次很干净的增量构建失效剖析:源码一行未改,第二次 make images 仍重新生成 PlatformProps.java、编译整个 java.base 并重建 JDK image。它说明构建缓存的正确性不仅取决于输入文件,还取决于“生成规则的身份”是否包含完整平台维度。
核心技术结论: 交叉编译同时需要 build JDK 与 target JDK。原规则把两次 SetupTextFileProcessing 都登记为同一个 BUILD_PLATFORMPROPERTIES_JAVA,它们的目标 OS/CPU 替换值不同,却共享同名的 variable-dependency 状态;两边轮流覆盖状态后,下一次构建总会认为生成规则发生了变化。
补丁把规则身份改为:
BUILD_PLATFORMPROPERTIES_JAVA_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU)并让 TARGETS 引用同样带平台后缀的名字。这样 linux-x86_64、build JDK 与其他 target 的依赖记录各自独立,缓存键终于包含了真正影响输出的 OS/CPU。
最有价值的实验、源码与 benchmark 细节: 作者用同一配置连续执行:
make CONF=linux-x86_64-server-release LOG=debug images修改前,第二次构建日志仍出现:
Processing PlatformProps.java
[buildjdk] Processing PlatformProps.java
Compiling up to 3396 files for java.base
[buildjdk] Compiling up to 3396 files for java.base
Creating jdk image修改后,在没有改动任何源码的前提下,第二次 make images 约 2 秒结束,并且上述生成、3,396 文件编译和 image 创建步骤全部消失。源码 diff 只有 GensrcMisc.gmk 的 4 行新增、3 行删除,因果链非常集中:不是提高 javac 吞吐,而是从依赖图里消除一次错误的全量失效。
适合的工程师背景: 维护 OpenJDK、LLVM、Android、嵌入式 SDK 或大型多平台 monorepo 构建,熟悉 Make/Ninja/Bazel 的 action key、生成代码和 host/target 双工具链问题的构建工程师。
预计阅读收益: 约 15–25 分钟;可迁移的检查方法是:对零改动的第二次构建抓取首个意外 action,比较 host 与 target 的生成规则身份,并确认缓存键同时覆盖输入内容、替换参数和目标平台,而不是先归咎于编译器本身。
02 · Rust next-solver:把重复查询值驻留成引用,峰值内存约从 15 GiB 降到 4 GiB
原文与日期: laundmo,2026-08-31(中原标准时间);rust-lang/rust PR #162031。复现背景见 rust-lang/rust issue #161748,项目状态见 Stabilize the next-generation trait solver。
为什么值得读: next-solver 遇到深层 auto-trait 递归时,真正吃内存的不一定是谓词数据本身,而可能是搜索图和 nested-goal cache 为每个键保存的结构性副本。Bevy bevy_render 恰好提供了现实压力场景:IndirectParametersBuffers: Sync 展开成长链条并触及递归上限,让键布局的固定开销被海量放大。
核心技术结论: 原先 CanonicalInput<I> 以完整值进入 NestedGoals 与 search_graph::GlobalCache 的 HashMap 键;作者观察到 HashMap 索引相关结构是峰值内存主体,并记下单项原布局约 56B。补丁增加 Interner::CanonicalInput 关联类型,在 canonicalize_goal 结束时调用 mk_canonical_input,由 TyCtxt 的 InternedSet<CanonicalInputData<_>> 对查询输入驻留。
type CanonicalInput: Copy + Debug + Hash + Eq
+ Deref<Target = CanonicalInputData<Self>>;
let query_input = delegate.cx().mk_canonical_input(
CanonicalQueryInput { canonical, typing_mode }
);缓存键随后只复制一个 interned reference;相同 canonical query 的实体只存一份。代价是新增一张驻留表和一次哈希查找,但在高重复、深递归的 solver workload 中,减少的键副本远大于驻留元数据。
最有价值的实验、源码与 benchmark 细节: PR 作者用 Heaptrack 与 btop 编译启用 next-solver 的 bevy_render,峰值内存约从 15 GiB 降至 4 GiB,降幅约 73%。独立问题报告在另一环境中记录了约 11 GiB 对 1.5 GiB(约 7.3 倍)的 next-solver/旧 solver 峰值差异,并给出 rustc nightly、LLVM 版本和完整的递归谓词链;两组绝对值不同,但共同把问题指向超过 recursion limit 时快速膨胀的 solver 状态。
源码层面的关键点不是简单把 struct 装进 Arc:补丁在 rustc_middle::CtxtInterners 增加 canonical_inputs,把 SearchGraph::Input、root goal provider 和 proof-tree 路径统一改为 I::CanonicalInput,确保热路径不会在接口边界重新展开成按值键。当前 PR 尚未给出完整 rustc-perf 生态矩阵,因此 15→4 GiB 应视为针对 Bevy 复现的强信号,而不是所有 crate 的普遍比例。
适合的工程师背景: 熟悉 rustc trait solver、canonicalization、查询缓存、HashMap 键布局,或正在为编译器、规则引擎、图搜索系统处理“结构值重复进入多层缓存”问题的工程师。
预计阅读收益: 约 30–45 分钟;可以得到一套可迁移判断:先用 heap profiler 区分 payload 与索引/键开销,再在对象不可变、重复度高且生命周期统一时引入 interning,同时保留端到端 workload 验证,避免把局部 size_of 改善误当作系统收益。
中国大陆 ToC 硬件价格观察
数据口径
窗口为 2026-08-01 至 2026-08-31,单位人民币。周末至周一早间尚未取得六个代表 SKU 的新同口径公开成交记录,因此沿用最近可复核的 8 月 25–26 日快照;没有把抓取日期冒充变价日期,也没有插值补齐逐日行情。下图六个面板分别对应 CPU、GPU、主板、DRAM、HDD、SSD,每一折点均为公开可追溯的实际报价。
| 类别 | 代表样本与最近可核验价 | 近 30 天走势 | 建议 |
|---|---|---|---|
| CPU | Ryzen 7 9800X3D,8/26 约 ¥3,175 | 8/10 促销 ¥2,283,8/21 ¥2,597,随后明显回弹 | 观望;9850X3D 同日约 ¥3,295,仅贵约 ¥120,旧款当前缺少价格优势 |
| GPU | 万丽 RTX 5070 OC 12GB,8/25 约 ¥6,899 | 窗口低点约 ¥5,249,后段明显走高 | 观望;国内渠道仍处 7 月底涨价后的高位,非生产力刚需不追高 |
| 主板 | B850M 同档样本,8/25 约 ¥1,298 | 原跟踪样本小幅回落;8/26 其他品牌出现 ¥799 促销 | 可按需入手;品牌间价差大于时间趋势,优先比较供电、M.2、网卡与售后 |
| DRAM | Kingston Fury DDR5-6000 32GB,8/25 约 ¥3,900 | 8/7 约 ¥3,870,高位横盘 | 刚需小量买,不囤;上游与渠道报价尚未形成连续下行 |
| HDD | IronWolf Pro 8TB,8/25 约 ¥1,540.7 | 可核验快照持平 | 容量告警时分批买;不要把一次促销当成供给趋势反转 |
| SSD | ZHITAI Ti600 2TB,8/25 约 ¥749 | 7/26 至最近快照持平 | 刚需可买但不囤;NAND 现货参考价仍缺少持续回落证据 |
零售价格来源: 9800X3D 与 9850X3D 国内同日价差、9800X3D 历史价格摘要、RTX 5070 商品百科、B850M 商品百科、8 月 26 日 B850M 市场样本、Kingston Fury 32GB、IronWolf Pro 8TB、ZHITAI Ti600 2TB。
判断依据
经济日报 8 月 14 日的华强北走访记录了 7 月 24 日起显卡快速拉涨、7 月 27 日后高位趋稳:RTX 5060 从约 ¥2,300–2,500 升至约 ¥3,000,RTX 5070 Ti 从约 ¥6,000 升至 ¥8,000 以上。这与跟踪样本的后段抬升一致,因此 GPU 仍建议观望,而不是把“涨幅收窄”解释为降价。
存储侧 8 月 28 日 闪存市场现货报价 中多种 TLC/QLC NAND 与同周 DDR5 UDIMM 渠道参考价持平。该渠道美元价不进入中国 ToC 折线,但它尚未提供持续下跌的供应侧信号。CPU 建议仍基于同平台新旧型号的即时价差;主板跨品牌促销差异已经大于短期时间趋势,适合按功能购买。
其它你可能关心的
- Rust:减少 canonicalizing external constraints 时的分配,但当前 rustc-perf 出现指令回退
- Rust:为宏展开结果复用 arena 的实验;完整基准后因无收益而关闭
本期结论
两篇材料都在修正“缓存键与真实输入不匹配”,但方向相反。OpenJDK 的键太窄,遗漏目标 OS/CPU,导致不同平台互相覆盖状态;rustc 的键太重,把大量相同 canonical input 作为结构值复制进多层缓存。前者补齐身份维度,后者用驻留压缩重复实体。工程上值得记住的不是一概增加或减少缓存,而是让键同时满足身份完整、表示紧凑和生命周期可控。