Files
future-harmony-freeze-oom-fix/harmony-ths-futures-apm-oom/doc/change-notes/12-trade-sdk-market-price-cache-cleanup.md
T

3.2 KiB

交易 SDK 市价缓存去重与正确删除

修复提交

仓库 分支 Commit ID 说明
harmony_futures_trade_sdk feature/FUHM-1979-match-push-optimization fbfb85d704510fcbe94d1c58f732e0add4a76292 修复市价缓存重复写入和删除失效

问题

交易 SDK 的 DefaultMarketPriceCacheCenter 使用数组保存 ContractMarketPrice。原有 removeCache() 误用 slice(i, 1),该调用只返回数组片段,不会修改原数组,因此已消费的缓存节点仍被单例缓存中心长期持有。

原有 cachePrice() 对相同 ContractBean + MarketPriceType 的价格也会无条件新增节点。交易页反复取价或刷新时,同一缓存键会持续产生重复对象;即使业务调用删除,旧节点仍无法从数组移除,导致缓存数组和 Local Heap 随调用次数增长。

优化方案

  1. removeCache() 使用 splice(i, 1) 原地删除命中的缓存节点。
  2. cachePrice() 写入前查找相同合约和价格类型;命中时只更新最新价格并返回,不再追加重复节点。

影响范围

  • 生产代码修改位于兄弟仓库 ../harmony_futures_trade_sdk/FuTrade 的市价缓存中心。
  • 主工程不修改交易协议、报价来源或下单流程;正式依赖仍保持 1.0.13,待交易 SDK 发布包含该修复的新版本后再升级版本号和锁定结果。
  • 缓存键仍为既有的 ContractBean + MarketPriceType;不同合约或价格类型之间不会互相覆盖。

预期收益与边界

相同缓存键连续更新时,缓存节点数量从随调用次数线性增长收敛为最多一个;缓存被消费后会立即从数组移除。以本次 100 万次重复更新为例,节点数由潜在的 100 万个降至 1 个,删除后降至 0,重复节点消除率接近 100%。

根据 ContractMarketPrice 的对象字段、数组引用和价格字符串开销保守估算,100 万次重复更新可避免约 60~120 MB 的常驻堆增长;20 万次缓存/删除循环可避免约 12~24 MB 的残留。实际 PSS 和 JS Heap 收益受 Ark Runtime 对象布局、字符串表示及 GC 时机影响,仍应以修复前后的同场景 Profiler Trace 为准。

该修改只治理交易 SDK 市价缓存数组的重复节点和错误删除,不覆盖全局行情请求缓冲、实时订阅、整表解析与 UI 全量刷新等其他 OOM 链路。

验证结果

  1. FuTrade@default 构建成功并生成新的 FuTrade.har;主工程 entry@defaultentry@ohosTest 均通过直接 Hvigor 构建。
  2. 在 Pura 90 模拟器执行 100 万次相同缓存键更新,耗时 148 ms;最终读取到最新价格,删除后缓存为空。
  3. 在同一测试进程执行 20 万次缓存/删除循环,耗时 90 ms;循环结束后缓存为空。
  4. Instrumented Test 共执行 4 个用例,结果为 Pass 4 / Failure 0 / Error 0,总测试耗时 239 ms。
  5. 测试完成后未发现 com.hexin.plat.hmn.futures 的 OOM、JS Crash 或 CppCrash 记录。
  6. 提交前已清理主工程的本地 HAR 路径、oh_modules 同步修改、临时 Instrumented Test 接入和 SDK 测试代码,避免提交不可移植的联调依赖或压力测试代码。