XPerf
语言Java

jvmperf 证据政策

门槛

只有当以下两者都存在于 packages/jvmperf/evidence/ 下时,JP 规则才可以被记录/处理为 error(保留/升级合同以供指南和未来的 --preset 使用):

  1. <RULE>.md — 声明、利用,JDK 版本 + JVM 参数(使用时包括 -XX:+UseCompactObjectHeaders),限制
  2. <RULE>.jsonl — ≥1 个前/后测量对,字段包括 rule、case、role(before = 问题,after = 修复)、jdk、jvm_args、ns_per_op(或 median_ms / total_size_bytes)、alloc_b_per_op、ratio、ts

否则该规则保持 hint 或 off(一个审核提示):适用于内部测试和固定装置,但不是“必须为速度修复”的信号。

CLI 仍然可能在任何发现时 以非零退出(除非使用 --no-fail);打印的严重性标签遵循此策略表。完整的 --preset 配置稍后可选(镜像 jsperf/cperf)。

相关兄弟

  • 实时时钟 / 每操作字节协议:scripts/run-static-vs-hotspot.sh(写入 research/benches/static-vs-hotspot.{json,jsonl})

不要因为 PrintCompilation / compilation-log 的行数看起来吓人就升级——那些只是噪音(和 V8 --trace-deopt 计数的道理一样)。

当前映射

截至 2026-10-22(亚洲/上海);基准测试在 JDK 25.0.4.1 + COH 上进行。策略是 Rule.java 中每条规则的默认严重性。

规则政策证据关联 / 注释
jp-boxed-primitive-collection关闭jp-boxed-primitive-collectionJDK 27 n=1e6 ~1.32×, n=1e5 ~7.37×; 静默 JDK 21 ~11× / ~8.5×
jp-string-concat-hot错误jp-string-concat-hotJDK 27 J23 部件=256 ~21.3×
jp-regex-hot关闭jp-regex-hotJDK 27 时间 ~0.76×,分配 ~2.4×;安静 JDK 21 时间 ~1.67×
jp-format-hot关闭jp-format-hotJDK 27 ~29×
jp-unpresized-collection关闭jp-unpresized-collectionJDK 27 n=10k ~1.43×
jp-boxed-stream错误jp-boxed-streamJDK 27 boxedReduce/mapToInt ~37×
jp-exception-control-flow关闭jp-exception-control-flowJDK 27 ~4.0×(峰值);静默 JDK 21 ~27×
jp-legacy-synchronized-type已移除墓碑测量约 ~1.08× / HT 阴性 — 匹配器已删除
jp-many-boolean-fields已移除墓碑COH 16=16 无胜 — 匹配器已删除
jp-enum-key-hash-collection错误jp-enum-key-hash-collectionJDK 27 EnumMap ~11.6×
jp-collection-chain关闭jp-collection-chainJDK 27 / Kotlin 2.4.21 eager/seq ~265×
jp-value-class-boxing提示jp-value-class-boxingJDK 27 时间 ~4.0×, 分配 ~5.0×
jp-lambda-to-non-inline-hot关闭jp-lambda-to-non-inline-hotJDK 27 分配 ~244×;时间 ~0.47×
jp-lazy-default-mode关闭jp-lazy-default-mode.md 仅待测量 — 情境懒惰模式
jp-data-copy-hot错误jp-data-copy-hotJDK 27 时间 ~208×, 分配 ~10001×
jp-android-sparse-array提示存根 md待定 — 需要 ART/设备
jp-log-hot关闭jp-log-hotJDK 27 时间平均 ~0.43×(一次峰值);安静的 JDK 21 ~18×;分配 ~23200 B
jp-sleep-polling关闭stub md待定 — 睡眠占主导;设计不是微型的
jp-最终确认提示存根 md待定 — 最终确认正确性 / 更清理
jp-expensive-alloc-hot关闭jp-expensive-alloc-hottiny-pool 负面
jp-hot-heavy-alloc关闭存根 md待处理 — ART/设备热分配
jp-hot-format-log关闭stub md待处理 — ART/设备热格式/日志
jp-hot-system-call提示存根 md待定 — ART/设备系统调用
jp-bitmap-decode-no-reuse提示桩 MD待定 — ART/设备位图
jp-hot-post-lambda提示存根 md待处理 — ART 处理程序发布
jp-ui-text-append提示stub md待定 — ART UI 文本
jp-baos-tobytearray-copy错误jp-baos-tobytearray-copyJDK 27 toByteArray/writeTo ~99×
jp-hot-payload-copy错误jp-hot-payload-copyJDK 27 newFrame/reuse ~158×
vt-unsafe-threadlocal-pool—(未发布)存根; 指南固定装置guide-first §10.2
jp-client-factory-recreate错误jp-client-factory-recreateJDK 27 HttpClient 新建+关闭/重用 ~1.97e5×
jp-string-intern-hot错误jp-string-intern-hotJDK 27 intern/plain ~6.3×
jp-non-static-field-updater提示jp-non-static-field-updaterJDK 27 创建 ~526×;静默 JDK 21 稳态 ~1.13×

计数(当前默认值): 活跃规则 29(原为 31;移除了 jp-legacy-synchronized-type / jp-many-boolean-fields):8 个 错误,8 个 提示,13 个 关闭。表格仍列出墓碑规则和未发布规则。默认严重性遵循 Rule.java / G3 反向优化。

再生

cd packages/jvmperf
# Lint/tests: JAVA_HOME → JDK 21. Optional benches may use 25:
JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64 bash scripts/run_jmh.sh J32_RuleEvidenceBatch
JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64 bash scripts/run_kotlin_alloc.sh K15
# then refresh evidence/*.jsonl from bench-results if numbers move

在 JDK 主要升级后重新运行。永远不要发明比例。

另请参阅共享的 rule-regression.md。