XPerf
语言Java证据

jp-expensive-alloc-hot — 循环中的高成本分配(作用域 + 负池神话)

申诉(规则意图)

应将昂贵可重用类型(SimpleDateFormat、ObjectMapper、MessageDigest、大型常量缓冲区等)的热构造提升或缓存。这就是 jp-expensive-alloc-hot 所标记的内容。

邻近测量(仅凭此不要升级)

小型逃逸对象是另一回事:一个天真的线程本地/回收 小型 Point 类对象的池可能在墙钟时间上输给普通 TLAB new,同时在每次操作字节数上获胜。

  • 测试平台:J24_PoolVsAlloc.java / scripts/run_jmh.sh J24_PoolVsAlloc
  • 对比:pooled vs tlabAlloc,批量大小 batch=1
  • 原始数据:research/bench-results/J24_PoolVsAlloc.jsonl
  • 关联:STATIC-VS-HOTSPOT 案例 5 部分 / 负面
FieldValue
时间2026-10-23 亚洲/上海
JDK27 (27+35)
JVM 参数-XX:+UseCompactObjectHeaders
pooled[batch=1]8.250 ns/op, 0.000 B/op
tlabAlloc[batch=1]3.826 ns/op, 16.000 B/op
池 / TLAB 时间池慢约 2.16 倍

与 lint 的对应

默认严重性 关闭(使用 --enable 运行它)。证据文档 说明我们为何不将 jp-expensive-alloc-hot 从 J24 升级为 error:该规则的有价值目标是昂贵的工厂;J24 警告不要在循环中的每个 new 操作中都理解为“始终使用池”。

限制

  • 没有JMH配对将“新简单数据格式”与“线程本地”/“日期Formatter”相隔开来——这将是正向升级的路径。
  • VT + 脂肪 ' Thread Local ' 池 → 见指南JP029(指南-第一固定装置),而不是jp - 成本-分配热。