找回密码
 立即注册

QQ登录

只需一步,快速开始

spreadjs666
金牌服务用户   /  发表于:2024-10-29 14:07  /   查看:283  /  回复:8
本帖最后由 Wilson.Zhang 于 2024-11-8 14:00 编辑


产品:SpreadJS
版本:17.1.8
调研编号:SJS-27082
Last Review:2024-11-08
当前进展:已在17.1.9版本修复。

场景:用户在vue项目中目录树来回切换会触发多次fromJSON

问题:spread.destroy后,有些数据依旧会存在内存当中,导致用户切换多次后,内存累增

在demo中执行以下代码即可浮现:
  1. // 模拟渲染第一篇文章
  2. window.fn(window.excel1);

  3. // 模拟切换第二篇文章
  4. window.sheet = null;
  5. window.spread.destroy();
  6. window.spread = null;
  7. window.fn(window.excel2)

  8. // 模拟切换至非excel页面
  9. window.sheet = null;
  10. window.spread.destroy();
  11. window.spread = null;
复制代码
image.png210852049.png

static 17.1.5的副本.zip

9.14 MB, 下载次数: 2

评分

参与人数 1金币 +500 收起 理由
Ellia.Duan + 500

查看全部评分

8 个回复

倒序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-10-29 17:49:19
沙发
本帖最后由 Ellia.Duan 于 2024-10-29 18:07 编辑

您好,我需要多次测试下,有结果会及时通知您。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-10-30 10:07:54
板凳
本帖最后由 Ellia.Duan 于 2024-10-30 14:50 编辑

您好,重新修改了您的html文件,且将版本更新为最新版17.1.8。
代码调整如下:
  1. function loadSpread1() {
  2.         return new Promise((resolve, reject) => {
  3.           window.fn(window.excel1);
  4.           console.log('加载1')
  5.         });
  6.       }

  7.       function loadSpread2(i) {
  8.         return new Promise((resolve, reject) => {
  9.           window.sheet = null;
  10.           window.spread.destroy();
  11.           window.spread = null;
  12.           console.log('销毁2', i)
  13.           window.fn(window.excel2)
  14.           console.log('加载2', i)
  15.         });
  16.       }

  17.       function loadSpread3() {
  18.         return new Promise((resolve, reject) => {
  19.           window.sheet = null;
  20.           window.spread.destroy();
  21.           window.spread = null;
  22.           console.log('销毁3')

  23.         });
  24.       }


  25.       let list = [], num = 500
  26.       for (let i = 0; i < num; i++) {
  27.         if (i == 0) {
  28.           list.push(loadSpread1())
  29.         } else if (i == num - 1) {
  30.           list.push(loadSpread3())
  31.         }
  32.         else {
  33.           list.push(loadSpread2(i))
  34.         }
  35.       }

  36.       Promise.all(list).then(() => {
  37.         console.log("finish");
  38.       });

  39.     }
复制代码
在此基础上,修改num的值分别为10,100,500 ,观察memory变化。 分别对应memory大概为100M , 300M , 1000M 。
我将深入调研此问题。调研编号:SJS-27082

excel (3).zip

8.99 MB, 下载次数: 1

回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-10-30 15:24:29
地板
本帖最后由 Ellia.Duan 于 2024-10-30 15:25 编辑

您好,根据楼上的demo ,调研结果如下:


1、在fromJSON中使用incrementalLoad,这将使fromJSON流程变为异步,一旦fromJSON流程变为异步模式,即表示。
     1)当使用destroys 销毁spread对象时,spread仍在fromJSON过程中   
     2)当加载一个json时,可能之前的fromJSON过程还没有完成。所以,需要在测试demo中,注释掉incrementalLoad相关代码,否则将会报错。
      当然,这个问题在用户实际来回点击过程中,有可能出现(还未加载完成,切换另一个页面),有可能不出现。

2、在您的代码中,初始化了Designer对象,但是销毁了spread ,这是一个不正确的用法。
  1) 可以销毁designer对象。designer.destroy()
  2)    如果初始化的是spread对象 ,可以用spread.destroy()


经过上面修改后,html文件如下: index_update (1).html (4.07 KB, 下载次数: 2)
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:2024-10-30 15:31:25
5#
Ellia.Duan 发表于 2024-10-30 15:24
您好,根据楼上的demo ,调研结果如下:

您好,由于文档内容过大,因此我们需要才用incrementalLoad去进行加载,否则会导致用户加载时间变长,因此期望在使用incrementalLoad的基础上修复此问题,感谢。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-10-30 16:40:19
6#
收到反馈,我继续调研此问题。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-11-1 16:15:38
7#
本帖最后由 Ellia.Duan 于 2024-11-1 16:23 编辑

您好,关于内存累加的问题将在17.1.9版本修复,我将此贴移至bug反馈区。
以及您提到的incrementalLoad异步加载问题,可以在callback时执行designer.destroy()。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-11-8 13:59:36
8#
您好!该问题已在17.1.9版本修复,17.1.9版本也已发布,您可以升级版本后使用。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:4 天前
9#
您好,17.1.9版本修复后,修改num值,内存情况如下图所示:
image.png730384521.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部