Skip to content

perf(bean): 优化复制后端与缓存并恢复转换器扩展 - #352

Open
zhou-hao wants to merge 15 commits into
5.0.xfrom
5.0.x-refactor-copy
Open

zhou-hao wants to merge 15 commits into
5.0.xfrom
5.0.x-refactor-copy

Conversation

@zhou-hao

@zhou-hao zhou-hao commented May 7, 2026 •

Copy link
Copy Markdown
Member

问题与结果

FastBeanCopier 重构后,嵌套 Map 转为由 BeanUtils 转换器创建的接口、抽象类或其他对象时,会绕过扩展转换器并尝试调用无参构造器,导致 ConfigMetadata.<init>() 等异常。现在恢复通用转换器扩展,并收口复制后端、类型转换、record 复制和缓存生命周期。

实现

  • 默认使用 asm-accessor;支持 hsweb.fast-bean-copier.backend 显式选择后端,native hint / disable-codegen 和动态类加载器场景回退到 reflection-accessor。record 复制使用 ASM 路径。
  • 嵌套属性使用调用方传入的 Converter;BeanUtils 转换器在转换时查询,注册、替换、注销无需清理 copier 缓存。集合、数组和 record 属性共享这一扩展行为。
  • 无泛型转换计划按 Class 缓存,泛型数组仅在缓存未命中时复制;共享计划只持有静态元数据,转换时使用当前 BeanFactory,避免局部工厂被全局计划滞留。默认无参构造器只缓存元数据,保持实例独立、访问检查与异常传播。
  • 类型对缓存按源 Class 组织目标,首目标直接存放,少量目标使用数组,更多目标使用哈希表;热命中不创建组合键,冷创建保留并发去重、失败重试和锁外工厂执行。
  • 默认集合与普通 Map 按已知元素数分配容量,保持类型、顺序、null 和独立复制语义;自定义集合仍使用无参构造器。
  • 强缓存通过 clearCache() / clearCache(ClassLoader) 显式释放,同时匹配源和目标类型;正在创建的匹配项可以返回给调用方,但不能重新填入已清理缓存。保留现有公共兼容入口及 CacheKey。

验证

  • mvn -o -pl hsweb-core -am test:126 项测试通过,0 失败、0 错误、0 跳过。覆盖四种后端的 BeanUtils 动态扩展、工厂替换与引用、泛型隔离、容器复制、record、并发 / 递归创建及类加载器清理。
  • 新增提交 322dbba78 复用已完成的阶段验证;提交前核对 219 个源码 / 字节码指纹,未发生变化,git diff --check 通过。
  • 本轮堆内存优化对照完成 160 个独立 JMH fork,针对性长预热复测完成 24 个 fork。基线为已包含转换器兼容修复及上一轮缓存优化的编译快照,两版 benchmark 字节码一致。
  • 同机 Temurin JDK 17.0.18 / JMH 1.37,单线程、512 MiB G1、gc profiler;长预热使用 5 × 1s 预热与 5 × 1s 计时,按基线 / 优化 / 优化 / 基线交错运行。

长预热代表性结果:

后端 / 场景 基线 → 优化 B/op 基线 → 优化 µs/op 耗时变化
ASM / 集合密集 Map → Bean 408 → 320 0.4058 → 0.4052 -0.2%
ASM / 仅嵌套对象 Map → Bean 504 → 392 0.2877 → 0.2529 -12.1%
ASM / 类型转换密集 Map → Bean 6144 → 5880 2.6706 → 2.7231 +2.0%
reflect / 嵌套密集 Map → Bean 960 → 896 0.5520 → 0.5949 +7.8%

补充探针:缓存热查询三轮均从 24 B/次降至 0 B/次;携带 8 MiB 负载的局部工厂在优化后可通过指定类加载器清理释放,基线仅全量清理后可释放。确定性对象图测试验证全局计划无法到达局部工厂。

缓存管理对象尺寸探针排除 Class 和共享 value:100 个源类型各对应 8 个目标时由 53072 降至 28472 B(-46.4%);各对应 1 个目标时由 6704 增至 6872 B,包含固定管理开销。

文档与边界

  • 更新 hsweb-core/README.md 的转换器扩展、工厂与缓存生命周期说明;完整阶段基线、四后端数据和性能取舍见 hsweb-core/src/test/java/org/hswebframework/web/bean/FastBeanCopierBenchmarkSummary.md。
  • 默认 ASM 转换密集场景长预热均值增加 2.0%,两版 fork 有波动和区间重叠;旧 reflect 嵌套密集场景的 7.8% 耗时增加可重复出现,属于减少分配的实际性能取舍。
  • 数据是单线程热缓存微基准与管理对象尺寸测量,不代表生产总堆、并发吞吐或尾延迟;未测冷创建成本。原始 JSON、日志、探针和编译快照保存在本地未提交的 target/jmh-results/。
  • 动态类加载器卸载仍要求显式清理缓存。native / 受限运行时具备 fallback,但未验证完整 native image;现有反射访问限制仍适用。

@zhou-hao zhou-hao changed the title refactor(bean): 重构 FastBeanCopier 复制后端并补齐兼容性验证 refactor(bean): 重构并优化 FastBeanCopier 复制后端 May 28, 2026
@zhou-hao
zhou-hao marked this pull request as ready for review May 28, 2026 01:21
@zhou-hao zhou-hao changed the title refactor(bean): 重构并优化 FastBeanCopier 复制后端 perf(bean): 优化FastBeanCopier默认后端与缓存策略 May 31, 2026
zhou-hao added 3 commits May 31, 2026 13:11
# Conflicts:
#	hsweb-core/src/main/java/org/hswebframework/web/bean/FastBeanCopier.java
#	hsweb-core/src/test/java/org/hswebframework/web/bean/FastBeanCopierTest.java
@zhou-hao zhou-hao changed the title perf(bean): 优化FastBeanCopier默认后端与缓存策略 perf(bean): 优化FastBeanCopier复制能力与缓存策略 Jul 14, 2026
@zhou-hao
zhou-hao force-pushed the 5.0.x-refactor-copy branch from 308e299 to 670effb Compare July 14, 2026 09:47
@zhou-hao zhou-hao changed the title perf(bean): 优化FastBeanCopier复制能力与缓存策略 perf(bean): 优化FastBeanCopier默认后端与缓存策略 Jul 14, 2026
zhou-hao added 3 commits July 14, 2026 19:19
# Conflicts:
#	.github/workflows/pull_request_5x.yml
#	hsweb-core/src/main/java/org/hswebframework/web/bean/FastBeanCopier.java
恢复嵌套 Map 的自定义与动态 BeanUtils 转换器支持。
解除共享计划对局部 BeanFactory 的持有,按元素数创建默认容器,
通过类型对缓存消除热查询组合键分配,并保留并发与类加载器清理契约。

126 项测试通过,完成 184 个性能 fork;记录分配收益与旧 reflect 的耗时取舍。
@zhou-hao zhou-hao changed the title perf(bean): 优化FastBeanCopier默认后端与缓存策略 perf(bean): 优化复制后端与缓存并恢复转换器扩展 Oct 8, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant