本期检索说明
先读取 content/collections/deep-radar 截至 2026-10-16 的全部原文链接,并按 URL、标题与实现机制去重。最近 24 小时内,OpenJDK 出现两项同时具备源码 diff、可复核实测与原理证据的新工作:一项为 s390 普通及 ZGC 对象数组复制引入向量循环,另一项让 JDI ArrayType.newInstance() 先在目标 class loader 内定位组件类。两者均未在既往报告出现。
Kotlin/Native 调用图构建优化给出了缓存继承层次查询、提前截断过大 fan-out 等有价值的源码思路,但目前只有“部分场景一个数量级”的描述,没有公开原始 benchmark 数值;Rust 当天的性能候选仍在等待 rustc-perf;Zig 与 Linux 也没有新的材料同时满足“实测 + 源码/汇编 + 原理”三项标准。因此本期收录 2 篇 OpenJDK 材料,并保留 s390 ZGC 小数组回退与 JDI 单机定向实验的边界。
| 主题 | 原始发布日期 | 一手来源与交叉验证 | 截稿状态 | 推荐强度 |
|---|---|---|---|---|
| s390 普通与 ZGC 对象数组复制向量化 | 2026-10-16 16:45(中原标准时间) | OpenJDK PR #33403 / 完整 diff / JMH 数据 / JBS 8393875 | 开放评审 | 强烈推荐,重点看 barrier mask 的向量快路径与逐 lane 回退 |
| JDI 数组分配先查目标 class loader | 2026-10-16 23:13(中原标准时间) | OpenJDK PR #33414 / 完整 diff / JBS 8343851 / Reviewer 审核 | 开放评审,已有 1 位 Reviewer 批准 | 强烈推荐,重点看搜索空间收缩和 hidden class fallback |
01 · OpenJDK s390:普通与 ZGC 数组复制改走向量循环
原文与日期: Harshit470250,2026-10-16 16:45(中原标准时间);OpenJDK PR #33403、完整源码 diff 与 JBS 8393875。
为什么值得读: 这不是把标量 load/store 机械替换成一条向量指令。普通 conjoint copy 需要处理重叠区间和反向复制;ZGC 路径还要检查 load-bad、store-bad 与 store-good 颜色位,并在屏障不能走快路径时回退。补丁把“批量复制”和“屏障语义”一起编码进 s390 stub,展示了 GC barrier 与 ISA 向量化真正交汇的工程边界。
核心技术结论: 普通 conjoint stub 原本每轮复制 8 字节,现在每轮以 VL/VST 各处理两个 16 字节向量,即 32 字节,并保留标量尾部。ZGC disjoint/conjoint stub 则每次载入两个 oop(16 字节),用向量 AND 与 VTM 一次检查颜色掩码;load-good/store-good 时整向量清色、着色并写回,检测到坏位才拆成两个 64 位 lane 调用既有标量屏障。普通 disjoint copy 继续使用更合适的 MVC,没有为了“全向量化”替换已经更快的路径。
__ z_vl(Vdata, Address(src));
__ z_vn(Vscratch, Vdata, _vec_load_bad);
__ z_vtm(Vscratch, Vscratch);
__ branch_optimized(Assembler::bcondNotZero, fallback);
__ z_vo(Vdata, Vdata, _vec_store_good);
__ z_vst(Vdata, Address(dst));最有价值的实验、源码与 benchmark 细节: PR 给出了 15 次采样的 ArrayCopyObject JMH 吞吐。普通 conjoint copy 在规模扩大后收益稳定上升:
| 元素数 | 修改前 ops/ms | 修改后 ops/ms | 实算变化 |
|---|---|---|---|
| 31 | 74,059.126 | 92,964.735 | +25.53% |
| 127 | 31,167.686 | 53,721.584 | +72.36% |
| 2,047 | 2,301.107 | 4,755.938 | 2.07× |
| 8,191 | 582.822 | 1,223.752 | 2.10× |
ZGC 路径更能说明限制:conjoint 31 元素从 45,696.006 降至 36,914.687 ops/ms,回退 19.22%;63 元素基本持平(+0.64%),127 元素起转正,2,047–8,191 元素提升约 20.56%–26.28%。ZGC disjoint 六档全部改善,范围约 10.04%–27.02%。这说明向量屏障的固定 mask 装载和 fallback 组织会伤害极小数组,但大数组能用一次判断覆盖两个 oop,逐步摊薄成本。
适合的工程师背景: 熟悉 HotSpot stub generator、ZGC 着色指针与 load/store barrier,或需要在非 x86 ISA 上优化运行时内存原语的工程师。
预计阅读收益: 约 40–60 分钟;能理解重叠数组反向复制、向量化屏障检查、标量 tail/fallback 如何组合,并学会为什么必须按大小与 GC 路径拆分 benchmark。
02 · OpenJDK JDI:把 7 万类全局扫描收缩到目标 class loader
原文与日期: benshuai5D,2026-10-16 23:13(中原标准时间);OpenJDK PR #33414、完整源码 diff 与 JBS 8343851。
为什么值得读: JDI 为引用数组执行 ArrayType.newInstance() 时,需要从数组签名找到组件类。旧实现调用 JVMTI GetLoadedClasses,遍历整个 VM 的已加载类,并为每个候选读取签名;应用加载的类越多,调试器一次数组分配就越接近 O(全局类数)。补丁没有增加缓存或改变协议,而是利用 JVM 5.3.3 的类加载器不变量,先把搜索空间限制在定义该数组的 loader 内,属于很容易迁移到调试器、反射和元数据索引的“先按所有权分区,再全局兜底”优化。
核心技术结论: getComponentClass() 先取得 array class loader,调用 GetClassLoaderClasses 只遍历该 loader 可见的类;公共的 findComponentClass() 负责签名与 defining loader 双重判等。如果局部集合未命中,再回退原有 GetLoadedClasses 全局扫描。hidden class 的签名包含 .,且 hidden class 及其数组不会出现在 GetClassLoaderClasses 中,因此这类签名直接跳过局部路径,保留全局查找;primitive 多维数组与 hidden array 也新增回归测试。
if (strchr(componentSignature, '.') == NULL) {
error = allClassLoaderClasses(arrayClassLoader, &classes, &count);
serror = findComponentClass(env, arrayClassLoader,
componentSignature,
classes, count, componentClassPtr);
if (serror != JDWP_ERROR(NONE) || *componentClassPtr != NULL) {
return serror;
}
}
// hidden class 或局部未命中:回退 allLoadedClasses()最有价值的实验、源码与 benchmark 细节: 在额外加载 70,000 个类的本地 JDI Object[] 测量中,单次调用从 17.27 ms 降至 0.156 ms;实算延迟下降 99.10%,约提速 110.7 倍。作者还运行了 191 个 com/sun/jdi、1,143 个 vmTestbase/nsk/jdi、114 个 nsk/jdwp 与 68 个 nsk/jdb 测试;总计 1,516 个通过样本,并明确保留既有排除项与不支持 transport 的 skip。该数据仍是单机定向实验,不代表所有调试场景都能达到 110 倍,但复杂应用的全局类数与单 loader 类数差距越大,收益越接近该机制预期。
适合的工程师背景: 熟悉 JVMTI/JDWP/JDI、类加载器隔离、hidden class,或正在排查 IDE 调试器在大型服务中元数据查询延迟的工程师。
预计阅读收益: 约 30–45 分钟;能掌握如何用语义不变量缩小全局搜索,并理解为什么 hidden class 需要独立 fallback 与专项回归测试。
中国大陆 ToC 硬件价格观察
数据口径
窗口为 2026-09-18 至 2026-10-17,单位人民币,六类硬件固定同一 SKU。今天通过公开比价页实时渲染结果复核 CPU、GPU、主板、HDD、SSD 五类报价;DRAM 页面仍显示“暂无报价”,因此不新增点。重复价格作为真实采样保留,用来区分“已复核横盘”和“未取得数据”。SSD 只记录固定 2TB 规格全网比价 ¥1,799,不采用跨容量 819 元起;主板继续采用当前规格全网比价 ¥1,298,不采用系列 1,169 元起。
| 类别 | 10 月 17 日可复核价 | 30 日窗口内真实走势 | 建议 |
|---|---|---|---|
| CPU | Ryzen 7 9800X3D,京东 ¥2,609 | 9/18 ¥2,619 → 9/23 ¥2,579 → 10/1–8 ¥2,694–2,699 → 10/9–17 ¥2,609 | 可关注但不追价;连续九日横盘,仍比窗口低点高 ¥30 |
| GPU | MSI RTX 5070 VENTUS 3X 12G,亚马逊中国 ¥4,464.34 | 窗口内多次实时复核均为 ¥4,464.34 | 刚需可比价后入手;单渠道横盘不足以代表整个显卡市场 |
| 主板 | ASUS TUF B850M-PLUS WIFI7,当前规格 ¥1,298 | 10/12–14 的 ¥1,169 为系列起价;10/15–17 当前规格均为 ¥1,298 | 观望并核对完整型号;当前规格已连续三日一致 |
| DRAM | 暂无报价;最后可复核 9/9 ¥3,900 | 本窗口没有可比报价 | 观望;不以其他容量、颗粒或时序替代固定 SKU |
| HDD | IronWolf Pro 8TB ST8000NE001,京东 ¥3,550 | 9/18–10/15 ¥1,849 → 10/16–17 ¥3,550 | 明确观望;低价渠道退出后连续两日只剩高价样本,仍不能解释为行业普涨 |
| SSD | ZHITAI Ti600 2TB,京东 ¥1,799 | 9/23–10/11 ¥1,799 → 10/12–13 ¥1,739 → 10/15–16 ¥1,699 → 10/17 ¥1,799 | 继续比价;较昨日反弹 ¥100(+5.89%),已失去窗口低点优势 |
价格来源: 9800X3D、MSI RTX 5070 VENTUS 3X、ASUS TUF B850M-PLUS WIFI7、Kingston FURY DDR5-6000 32GB、IronWolf Pro 8TB、ZHITAI Ti600 2TB。
判断依据
CPU、GPU、主板与 HDD 今日都与昨日同口径报价一致。Ti600 2TB 从 ¥1,699 回升至 ¥1,799,单日反弹 5.89%,而页面顶部 ¥819 仍是跨容量系列起价,不能作为 2TB 行情;短期购买应继续比较授权渠道,不再把昨日低点视为稳定成交锚。HDD 固定 8TB SKU 连续两日为 ¥3,550,仍只说明原 ¥1,849 低价渠道退出后的可见报价变化。DRAM 固定 SKU 继续缺价,走势图保留真实空白尾段。本期没有加入未经核实的新品或原厂产能消息。
本期结论
两项工作都通过“批量处理或缩小搜索域”消除线性成本:s390 stub 用向量 mask 一次处理多个 oop,但小数组必须正视固定开销;JDI 用 class loader 所有权先把候选集合收窄,再为 hidden class 保留全局兜底。前者说明 GC barrier 向量化需要按数据规模验证,后者说明高倍性能收益往往来自改变搜索空间,而不只是优化循环体。