You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Edge中Apryse WebViewer调用closeDocument/dispose后内存未释放

Apryse WebViewer Edge下无限列Excel内存泄漏问题

问题详情

我们用客户端单例Apryse WebViewer,按官方文档用loadDocument切换预览文件,碰到这些问题:

  • Edge里加载带无限列的2-3MB Excel文件,内存直接飙到3GB;
  • 关闭预览模态框时,已经调用dispose和closeDocument,但内存没释放——任务管理器里PDFWorker和OfficeWorker占大量内存,浏览器内存工具能看到大体积ArrayBufferJs对象;
  • 之前Chrome也有这问题,把backendType改成asm就解决了,但Edge里不管用;
  • 用户重复打开文件,内存一直涨,最后浏览器直接崩;
  • 试过这些方法都没用:调用dispose/closeDocument、切换backendType(asm/ems/wasm)、替换WebViewer实例、把数组缓冲区变量设为null触发GC、调用resetWorker;
  • 补充:同大小但不含无限列的Excel文件,渲染完全正常。

排查与解决方向

  1. 强制终止Worker进程
    在调用closeDocument后,手动获取WebViewer内部的Worker实例,调用terminate()彻底终止,再清空引用:
    const doc = instance.Core.documentViewer.getDocument();
    if (doc) {
      const worker = doc.getWorker();
      if (worker) {
        worker.terminate();
        doc.setWorker(null); // 清空Worker引用
      }
    }
    instance.Core.closeDocument();
    instance.dispose();
    
  2. Edge专属后端配置
    初始化WebViewer时,强制指定asm后端并调整Worker加载模式:
    WebViewer({
      path: '/webviewer/lib',
      backendType: 'asm',
      disableWebAssembly: true,
      workerLoadingMode: 'inline', // 避免Worker进程残留
    }, document.getElementById('viewer'));
    
  3. 预处理Excel文件
    服务端提前过滤Excel的无限列,只保留有效数据列再传给前端——比如用SheetJS或Apache POI处理,把空白无限列截断,减少解析时的内存占用;
  4. 调整Edge浏览器设置
    关闭Edge的「内存节省模式」「性能模式」,这类模式可能干扰Worker进程的正常回收;同时升级Edge到最新稳定版,排查是否是浏览器自身的Worker内存泄漏bug;
  5. 放弃单例模式
    如果单例的内存回收问题无法解决,改成每次打开预览时创建新的WebViewer实例,关闭时彻底删除对应的DOM节点,清除所有相关变量引用,避免残留。

内容的提问来源于stack exchange,提问作者Nathaniel Yu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:32:44