spreadjs666 发表于 2024-10-29 14:07:16

【v17】内存泄漏问题

本帖最后由 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中执行以下代码即可浮现:
// 模拟渲染第一篇文章
window.fn(window.excel1);

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

// 模拟切换至非excel页面
window.sheet = null;
window.spread.destroy();
window.spread = null;

Ellia.Duan 发表于 2024-10-29 17:49:19

本帖最后由 Ellia.Duan 于 2024-10-29 18:07 编辑

您好,我需要多次测试下,有结果会及时通知您。

Ellia.Duan 发表于 2024-10-30 10:07:54

本帖最后由 Ellia.Duan 于 2024-10-30 14:50 编辑

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

      function loadSpread2(i) {
      return new Promise((resolve, reject) => {
          window.sheet = null;
          window.spread.destroy();
          window.spread = null;
          console.log('销毁2', i)
          window.fn(window.excel2)
          console.log('加载2', i)
      });
      }

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

      });
      }


      let list = [], num = 500
      for (let i = 0; i < num; i++) {
      if (i == 0) {
          list.push(loadSpread1())
      } else if (i == num - 1) {
          list.push(loadSpread3())
      }
      else {
          list.push(loadSpread2(i))
      }
      }

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

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

Ellia.Duan 发表于 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文件如下:

将此html文件,放到楼上给出的demo中,然后在浏览器中执行,发现修改num值为10,100,200 ,内存大小分别为:100M, 180M , 243M 。我将继续调研此问题








spreadjs666 发表于 2024-10-30 15:31:25

Ellia.Duan 发表于 2024-10-30 15:24
您好,根据楼上的demo ,调研结果如下:




您好,由于文档内容过大,因此我们需要才用incrementalLoad去进行加载,否则会导致用户加载时间变长,因此期望在使用incrementalLoad的基础上修复此问题,感谢。

Ellia.Duan 发表于 2024-10-30 16:40:19

收到反馈,我继续调研此问题。

Ellia.Duan 发表于 2024-11-1 16:15:38

本帖最后由 Ellia.Duan 于 2024-11-1 16:23 编辑

您好,关于内存累加的问题将在17.1.9版本修复,我将此贴移至bug反馈区。
以及您提到的incrementalLoad异步加载问题,可以在callback时执行designer.destroy()。

Wilson.Zhang 发表于 2024-11-8 13:59:36

您好!该问题已在17.1.9版本修复,17.1.9版本也已发布,您可以升级版本后使用。
{:5_110:}

Ellia.Duan 发表于 2024-11-18 15:10:06

您好,17.1.9版本修复后,修改num值,内存情况如下图所示:

Ellia.Duan 发表于 3 天前

您好,17.1.9版本已发布,请更新版本进行测试。
页: [1]
查看完整版本: 【v17】内存泄漏问题