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文件,渲染完全正常。
排查与解决方向
- 强制终止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(); - Edge专属后端配置
初始化WebViewer时,强制指定asm后端并调整Worker加载模式:WebViewer({ path: '/webviewer/lib', backendType: 'asm', disableWebAssembly: true, workerLoadingMode: 'inline', // 避免Worker进程残留 }, document.getElementById('viewer')); - 预处理Excel文件
服务端提前过滤Excel的无限列,只保留有效数据列再传给前端——比如用SheetJS或Apache POI处理,把空白无限列截断,减少解析时的内存占用; - 调整Edge浏览器设置
关闭Edge的「内存节省模式」「性能模式」,这类模式可能干扰Worker进程的正常回收;同时升级Edge到最新稳定版,排查是否是浏览器自身的Worker内存泄漏bug; - 放弃单例模式
如果单例的内存回收问题无法解决,改成每次打开预览时创建新的WebViewer实例,关闭时彻底删除对应的DOM节点,清除所有相关变量引用,避免残留。
内容的提问来源于stack exchange,提问作者Nathaniel Yu
相关产品推荐
相关产品推荐

