Files
future-harmony-freeze-oom-fix/harmony-ths-futures-apm-oom/doc/change-notes/13-webview-overview-request-cleanup.md
T

2.6 KiB

WebView 行情总览销毁时释放请求 Client

修复提交

仓库 分支 Commit ID 说明
harmony-ths-futures-apm-oom work-20260820-clz-FUHM-1979-apm-oom da5599387d82f06256e9224eb8c8001410de1a6b 补齐总览页面销毁解绑并断开 bridge 引用

问题

OverViewEvent 只处理 WebView 前后台切换,没有注册页面销毁回调。三个行情 client 已登记到全局 RequestQueueManagement 并写入请求缓冲后,如果 WebView 直接销毁,全局队列仍可能持有 client,client 又反向持有 WebViewJavaScriptBridge,形成跨页面 retained reference。

优化方案

  1. 注册 addAboutToDisappearCallBack(),页面销毁时统一调用 stopRequest()
  2. stopRequest() 在取消三个请求后清空每个 client 的 bridge 引用和 OverViewEvent 成员引用,使重复调用保持幂等。
  3. 销毁回调最后清空 OverViewEvent.webViewJSBridge,切断事件对象到 WebView bridge 的引用。

影响范围

  • 仅修改行情总览 JS 事件的销毁生命周期。
  • 不修改三个行情协议的 frameId、pageId、请求文本、解析或回调数据结构。
  • 前后台恢复行为保持不变;已收到 JS 事件时仍会在回到前台后重新创建请求。

预期收益与边界

每次总览页销毁会确定释放 3 个请求 client、对应请求缓冲和队列映射,避免其随反复进出页面线性累积。实际节省内存取决于 bridge、请求参数和页面对象引用图,本次没有设备堆快照,因此不估算具体 MB 或百分比。

该修复只覆盖 OverViewEvent 的三条行情请求,不代表其他 WebView JS 事件或全局行情链路已全部完成生命周期审计。

验证结果

  1. 对实际 OverViewEvent.ets 转译后使用模拟 bridge、请求缓冲和队列执行 20,000 轮“注册 → 发起 3 个请求 → 页面销毁”;每轮销毁后 retained request 为 0、retained client 为 0。
  2. 使用直接 Hvigor 构建 entry@default Debug HAP 成功,完整 ArkTS 编译、HAP 打包和签名通过;未执行安装。
  3. 临时压力测试文件和日志已删除,生产代码未保留计数、测试入口或调试日志。
  4. 确认“行情 → 总览”页面可加载;主 Tab 切换只改变前后台状态,不销毁 OverViewPage,当前产品入口无法在不终止 Ability 的情况下重复触发本修复的页面销毁回调,因此未将主 Tab 循环冒充为 OverViewEvent 销毁验证。
  5. 同次设备测试检查应用 Crash 日志及近 20 分钟错误日志,未发现 OOM、JS Crash、CppCrash、SIGSEGV 或 SIGABRT。